锁的升级也是 Synchronized 实现同步的关键,主要会涉及偏向锁、轻量级锁、重量级锁,下面分别详解@mikechen
偏向锁
偏向锁是JDK6中引入的一项锁优化,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。
偏向锁的基本思想是:
- 在无竞争的情况下,将对象的锁定状态记录在对象头中,并将线程ID记录在锁标志中。
- 以后访问该对象时,只需判断是否是记录的线程ID即可,不需要进行额外的加锁和解锁操作,从而减少了不必要的操作,提高了程序的性能。
- 当一个线程第一次访问一个对象时,它会尝试使用CAS操作将对象头中的标记位设置为偏向锁,并将自己的线程ID记录在锁标志中。
- 之后,该线程再次访问该对象时,会优先判断是否是自己的线程ID,如果是,则可以直接进入临界区,而不需要再次加锁和解锁。
轻量级锁
如果另外一个线程尝试访问这个对象,此时该对象的偏向锁状态就会失效,变成轻量级锁。
轻量级锁(lightweight lock)是Java虚拟机为了提高同步性能而引入的一种锁优化技术。
轻量级锁的优势在于,在无竞争的情况下,它避免了线程上下文切换、线程阻塞等操作,从而提高了程序的性能。
但是,轻量级锁在多线程竞争不激烈的情况下,可以有效地提高同步性能,但如果多个线程同时竞争同一个锁对象,轻量级锁的优化会失效,转而使用重量级锁,
重量级锁
重量级锁(heavyweight lock)是Java虚拟机为了保证多线程程序的数据一致性而引入的一种锁机制。
重量级锁的优势在于,它能够保证多线程程序的数据一致性,避免了数据竞争、死锁等问题。
但是,在高并发场景下,由于锁的竞争过于激烈,多个线程需要不断地竞争和阻塞等待锁的释放,从而导致程序性能下降。
重量级锁的实现需要依赖操作系统的底层支持,这种实现方式的代价比较高,会带来较大的性能消耗,所以放到最后升级为重量级锁。
锁的总结
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》