《深入理解Java虚拟机》十三:线程安全与锁优化

为了”压榨“计算机运算能力,可以让程序高效并发的执行,但需要保证并发的正确性,然后在此基础上实现高效。

大纲

线程安全与锁优化

线程安全

当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。

Java中的线程安全

按照线程安全的”安全程度“由强到弱来排序,可以将Java语言中各种操作共享的数据分为以下

  • 不可变
  • 绝对线程安全
  • 相对线程安全
  • 线程兼容
  • 线程对立

线程安全的实现方法

虚拟机是如何实现同步与锁的关系呢?

  • 互斥同步

    互斥同步是常见的一种并发正确性保障手段。最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,这种同步也称为阻塞同步

    • 同步:指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)线程使用。
    • 互斥:是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式。
  • 非阻塞同步
    基于冲突检测的乐观并发策略。先进行操作,没有其他线程争用共享数据,那操作就成功了。如果共享数据有争用,产生了冲突,就采用其他补偿措施(最常见的就是不断重试)。
  • 无同步方案
    • 可重入代码,也称为纯代码
    • 线程本地存储

锁优化技术

  • 自旋锁与自适应自锁
    为了让线程等待,我们只需让线程执行一个忙循环(自旋)。
  • 锁消除
    指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除。
  • 锁粗化
    将同步块的作用范围限制得尽量小
  • 轻量级锁
    JDK1.6加入的新型锁机制,”轻量“是相对传统锁而言
  • 偏向锁
    JDK1.6新引入的一种锁优化,目的是消除数据在无竞争情况下的同步原语,进一步提高程序的运行性能

公众号:亦袁非猿

欢迎关注,交流学习