为了”压榨“计算机运算能力,可以让程序高效并发的执行,但需要保证并发的正确性,然后在此基础上实现高效。
大纲
线程安全
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。
Java中的线程安全
按照线程安全的”安全程度“由强到弱来排序,可以将Java语言中各种操作共享的数据分为以下
- 不可变
- 绝对线程安全
- 相对线程安全
- 线程兼容
- 线程对立
线程安全的实现方法
虚拟机是如何实现同步与锁的关系呢?
互斥同步
互斥同步是常见的一种并发正确性保障手段。最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,这种同步也称为阻塞同步。
- 同步:指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)线程使用。
- 互斥:是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式。
- 非阻塞同步
基于冲突检测的乐观并发策略。先进行操作,没有其他线程争用共享数据,那操作就成功了。如果共享数据有争用,产生了冲突,就采用其他补偿措施(最常见的就是不断重试)。 - 无同步方案
- 可重入代码,也称为纯代码
- 线程本地存储
锁优化技术
- 自旋锁与自适应自锁
为了让线程等待,我们只需让线程执行一个忙循环(自旋)。 - 锁消除
指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除。 - 锁粗化
将同步块的作用范围限制得尽量小 - 轻量级锁
JDK1.6加入的新型锁机制,”轻量“是相对传统锁而言 - 偏向锁
JDK1.6新引入的一种锁优化,目的是消除数据在无竞争情况下的同步原语,进一步提高程序的运行性能