定义
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法时进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果
程度
不可变
immutable 的对象一定是线程安全的,例如 String
绝对的线程安全
不存在
1 | // 即使是 Vector 也会无法同步,如果要保证线程安全需要在 run() 中加入 synchronized |
相对的线程安全
Vector, HashTable
线程兼容
需要调用方手动实现线程安全,大部分类
线程对立
Thread.suspend() 和 Thread.resume() ,已被废弃
实现
互斥同步 Mutual Exclusion & Blocking Synchronization
synchronized
monitorexit, monitorenter
开销大;JDK1.6之后优化到和ReentrantLock性能相近
ReentrantLock
java.util.concurrent 包中的 ReentrantLock
- 等待可中断
- 公平锁
- 锁可以绑定多个条件
非阻塞同步 Non-Blocking Synchronization
基于硬件指令集的发展,先操作,再检测是否产生冲突
java.util.concurrent.AtomicInteger -> sun.misc.Unsafe -> CAS指令
无同步方案
可重入代码
线程本地存储 Thread Local Storage
java.lang.ThreadLocal 类中的key-value对
Volatile
适用场景:
- 布尔状态标志
- 单例模式的实例
- volatile bean 模式
参考资料
《深入理解Java虚拟机》第12章,第13章