synchronized锁升级原因
时间: 2023-06-10 11:07:29 浏览: 119
Java synchronized锁升级jol过程详解
5星 · 资源好评率100%
在Java中,锁有两种状态:无锁状态和重量级锁状态。在无锁状态下,线程间的切换不需要操作系统的介入,只需要通过CAS(Compare And Swap)操作即可完成,并且CAS操作是非常快速的。但是,在某些情况下,如果线程竞争锁的时间过长,则会导致性能下降。
为了解决这个问题,Java引入了锁升级机制。当线程竞争锁的时间超过某个阈值时,锁会从无锁状态升级为偏向锁状态。偏向锁是一种针对单线程的优化,它将锁的信息记录在对象头中,并且只有第一次获取锁时需要CAS操作,之后再次获取锁时就不需要CAS操作了。
如果有多个线程竞争锁,偏向锁会升级为轻量级锁。轻量级锁的实现方式是,通过CAS操作将对象头中的锁信息替换为指向锁记录的指针,锁记录中包含了获取锁的线程ID和指向对象头的指针。如果CAS成功,则表示当前线程获取了锁,如果CAS失败,则表示锁已经被其他线程获取了,此时锁会升级为重量级锁。
重量级锁的实现方式是,使用操作系统的互斥量(Mutex)来实现锁,这种锁操作需要操作系统介入,会导致线程的上下文切换,因此性能会有所下降。因此,在使用synchronized锁时,应该尽量避免锁的升级,减少锁的竞争时间,提高程序的性能。
阅读全文