一、同步问题的发生
对属性i进行i++操作不是同步的。i是类属性(方法内的i不在堆内存)
它的动作分解为:
1,从堆内存读取到当前线程栈内存,保存副本ii。
2,ii+1
3,修改i为ii+1。
试想两个线程同时执行i++,就是如果i=1,那么i可能为1,2,3。
二、java的同步机制
synchronized(同步):同步锁,进入它包裹代码块之前,需要获得当前java对象的锁。对于上述过程,必须一个线程全部执行完3个步骤,另一个线程才能开始。
valotile(不稳定的):当使用被修饰变量时候,每要都从堆内存中读取,不要保存副本。
使用的两个条件:
对变量的写操作不依赖于当前值。
该变量没有包含在具有其他变量的不变式中。
atomic(原子):利用了valotile读堆内存的特性。上述执行第3个步骤前,再次读出堆中值和副本ii对比,看原值是否被改变。
三、线程池
线程池基础接口: ExecutorService
基础接口的默认实现:ThreadPoolExecutor
java自带4中线程池(基于ThreadPoolExecutor):
1,Executors.newSingleThreadExecutor保持单个线程池
实现:
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
2,Executors.newFixedThreadPool 保持固定个数线程池
实现:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
3,Executors.newCachedThreadPool 可缓存的线程池,执行0到Integer.MAX_VALUE个线程任务
实现:
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
4,Executors.newScheduledThreadPool 定期任务线程池
实现(ScheduledThreadPoolExecutor):
super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
new DelayedWorkQueue());
相关推荐
java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料
Java多线程同步论文.doc
java多线程同步分析java多线程同步分java多线程同步分析析java多线程同步分析java多线程同步分析
java 多线程同步方法的实例 java 多线程同步方法的实例 java 多线程同步方法的实例
Java多线程同步.pdf
Java多线程同步具体实例讲解 .doc
Java多线程同步具体实例.doc
java.util.concurrent 包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发...
java 多线程同步详解 synchronized 的使用,锁定对象 ,锁定类 区别
基于Java多线程同步技术的简易模拟售票系统实现.pdf
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
Java多线程同步问题分析
Java多线程同步具体实例讲解.doc
Java多线程同步机制研究分析
Java多线程同步机制的应用分析
JAVA多线程同步机制及其应用
Java多线程同步问题的探究.pdf
Java多线程同步[文].pdf
Java多线程同步[定义].pdf
基于Java多线程同步的安全性研究.pdf