Java中Synchronized的偏向锁是如何撤销的?
在Java中,Synchronized关键字可以用于实现线程同步,确保多个线程对共享资源的访问互斥。在Java 6中引入了偏向锁的概念,用于优化同步操作。偏向锁是一种针对于无竞争的锁的优化,它可以让线程在进入同步块时不进行任何同步操作,从而提高程序的性能。
偏向锁通过在对象头中的标记字段记录线程ID来实现。当一个线程访问一个同步块时,它会尝试获取对象的偏向锁。如果对象的偏向锁标记为空,则将线程ID记录在对象头中的标记字段,并且将偏向锁标记设置为指向线程ID的指针,表示该对象被当前线程偏向。当其他线程尝试获取该对象的锁时,会发现偏向锁已经被占用,此时会检查偏向锁的线程ID是否与当前线程ID相同,如果相同,则表示可以直接获取锁,无需进行同步操作。
当其他线程尝试获取偏向锁失败时,会进行锁撤销的操作。锁撤销会先暂停持有偏向锁的线程,然后检查同步块是否存在竞争。如果存在竞争,则撤销偏向锁,将对象的锁标记设置为空。如果不存在竞争,则会尝试将对象的偏向锁升级为轻量级锁。
需要注意的是,偏向锁的撤销操作可能会导致额外的性能开销,因为线程在撤销偏向锁时需要暂停执行。因此,在某些情况下,偏向锁可能并不是最优的选择,可以考虑使用轻量级锁或重量级锁来实现线程同步
原文地址: http://www.cveoy.top/t/topic/iIvK 著作权归作者所有。请勿转载和采集!