Java sychronized 偏向锁撤销
在Java中,synchronized关键字用于实现线程同步。偏向锁是一种优化机制,它可以在没有竞争的情况下提供更好的性能。
偏向锁是指当一个线程访问同步块时,会给对象头中的Mark Word字段中的线程ID字段赋值为当前线程的ID。这样,当同一个线程再次访问同步块时,只需比较线程ID是否匹配即可,无需进行加锁和解锁操作。
但是,如果其他线程尝试访问同步块,偏向锁就会被撤销,撤销后的状态称为轻量级锁。撤销偏向锁的情况有以下几种:
- 其他线程尝试获取同步块时,发现该对象的Mark Word字段中的线程ID与自己的线程ID不匹配。
- 如果持有偏向锁的线程处于被阻塞的状态,那么其他线程也会去竞争锁,并且偏向锁也会被撤销。
- 如果持有偏向锁的线程已经结束,即线程退出。
- 如果一个线程在同步块中发生了等待(例如调用了Object.wait()方法),那么偏向锁也会被撤销。
当偏向锁被撤销后,会进入到轻量级锁的状态。轻量级锁是一种比重量级锁更轻量的锁实现,它使用CAS(Compare and Swap)操作来实现锁的获取和释放。如果轻量级锁获取失败,就会升级为重量级锁,即使用互斥量来实现锁的竞争。
总结来说,偏向锁的撤销是由其他线程的竞争或持有偏向锁的线程退出等情况触发的。撤销后会转为轻量级锁或重量级锁,以保证线程安全性
原文地址: http://www.cveoy.top/t/topic/iWa0 著作权归作者所有。请勿转载和采集!