偏向锁、轻量级锁、重量级锁(3种锁详解)

偏向锁、轻量级锁、重量级锁(3种锁详解)-mikechen

锁的升级也是 Synchronized 实现同步的关键,主要会涉及偏向锁、轻量级锁、重量级锁,下面分别详解@mikechen

偏向锁

偏向锁、轻量级锁、重量级锁(3种锁详解)-mikechen

偏向锁是JDK6中引入的一项锁优化,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。

偏向锁的基本思想是:

  1. 在无竞争的情况下,将对象的锁定状态记录在对象头中,并将线程ID记录在锁标志中。
  2. 以后访问该对象时,只需判断是否是记录的线程ID即可,不需要进行额外的加锁和解锁操作,从而减少了不必要的操作,提高了程序的性能。
  3. 当一个线程第一次访问一个对象时,它会尝试使用CAS操作将对象头中的标记位设置为偏向锁,并将自己的线程ID记录在锁标志中。
  4. 之后,该线程再次访问该对象时,会优先判断是否是自己的线程ID,如果是,则可以直接进入临界区,而不需要再次加锁和解锁。

 

轻量级锁

偏向锁、轻量级锁、重量级锁(3种锁详解)-mikechen

如果另外一个线程尝试访问这个对象,此时该对象的偏向锁状态就会失效,变成轻量级锁。

轻量级锁(lightweight lock)是Java虚拟机为了提高同步性能而引入的一种锁优化技术。

轻量级锁的优势在于,在无竞争的情况下,它避免了线程上下文切换、线程阻塞等操作,从而提高了程序的性能。

但是,轻量级锁在多线程竞争不激烈的情况下,可以有效地提高同步性能,但如果多个线程同时竞争同一个锁对象,轻量级锁的优化会失效,转而使用重量级锁,

 

重量级锁

偏向锁、轻量级锁、重量级锁(3种锁详解)-mikechen

重量级锁(heavyweight lock)是Java虚拟机为了保证多线程程序的数据一致性而引入的一种锁机制。

重量级锁的优势在于,它能够保证多线程程序的数据一致性,避免了数据竞争、死锁等问题。

但是,在高并发场景下,由于锁的竞争过于激烈,多个线程需要不断地竞争和阻塞等待锁的释放,从而导致程序性能下降。

重量级锁的实现需要依赖操作系统的底层支持,这种实现方式的代价比较高,会带来较大的性能消耗,所以放到最后升级为重量级锁。

 

锁的总结

偏向锁、轻量级锁、重量级锁(3种锁详解)-mikechen

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法