1. 什么是线程安全
如果一个对象可以安全的被多个线程同时使用,那么它就是线程安全的
当多个线程访问一个对象的时候,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。
2. Java中的线程安全
根据线程安全的安全程度由强至弱来排序,可以分为5类:
- 不可变
- 绝对线程安全
- 相对线程安全
- 线程兼容
- 线程对立
3. 线程安全的实现方法
- 互斥同步,
- synchronized
- ReentrantLock 重入锁
- 非阻塞同步,基于冲突检测的乐观并发策略,先进行操作,如果没有其他线程竞争共享数据,就操作成功了。否则,产生冲突,再采用补偿措施(最常见的就是不断重试),这种不需要将线程挂起,为非阻塞。这些涉及到处理器指令
- 测试并设置(Test-and-Set)
- 获取并增加(Fetch-and-Increment)
- 交换(swap)
- 比较并交换(Compare-and-Swap CAS)
- 枷锁链接/条件存储(Load-LInked/Store-Conditional LL/SC)
- 无同步方案
- 可重入代码 这种代码叫纯代码,可以在代码执行的任何时刻中断他,转而执行另一段代码,但是,回来之后,并不会出现任何错误。
- 线程本地存储 ThreadLocal
线程安全这块深究下去比较难。建议去看下深入理解JVM一书。
参考资料
- 深入理解JVM