关于线程同步(7种方式)
本文章部分内容转载于 "http://www.cnblogs.com/XHJT/p/3897440.html"
1 特殊域变量(volatile)实现线程同步 开销比较小
缓存一致性原理
JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存,其他处理器 会先判断所在的缓存行 内存地址是否改变 如果已经修改 会标记为无效 ,等到其他处理器要对这个数据修改时 会强制从系统内存中读取数据到缓存区 在执行操作
2 synchronized关键字修饰的方法 和同步代码 重量级锁 内存开销比较大
即有synchronized关键字修饰的语句块
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
代码如:
synchronized(object){
}
注:同步是一种高开销的操作,因此应该尽量减少同步的内容。
通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
javaSE 1.6 的优化
3 使用重入锁实现线程同步 JavaSE 5.0
在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。
ReentrantLock类是可重入、互斥、实现了Lock接口的锁,
ReenreantLock类的常用方法有:
ReentrantLock() : 创建一个ReentrantLock实例
lock() : 获得锁
unlock() : 释放锁
4.使用局部变量实现线程同步
ThreadLocal() : 创建一个线程本地变量 TLS区 Android的Looper对象
5.使用阻塞队列实现线程同步
LinkedBlockingQueue
6 使用原子变量实现线程同步
原子操作就是读取变量值、修改变量值、保存变量值看成一个整体来操作。即-这几种行为要么同时完成,要么都不完成