网站运营写营销,免版权费自建网站,速成建站,建设银行员工学习网站无锁--偏向锁--- 轻量级锁----重量级锁 ①、从无锁到偏向锁#xff1a;
当一个线程首次访问同步块时#xff0c;如果此对象无锁状态且偏向锁未被禁用#xff0c;JVM 会将该对象头的锁标记改为偏向锁状态#xff0c;并记录下当前线程的 ID。此时#xff0c;对…无锁--偏向锁--- 轻量级锁----重量级锁 ①、从无锁到偏向锁
当一个线程首次访问同步块时如果此对象无锁状态且偏向锁未被禁用JVM 会将该对象头的锁标记改为偏向锁状态并记录下当前线程的 ID。此时对象头中的 Mark Word 中存储了持有偏向锁的线程 ID。
如果另一个线程尝试获取这个已被偏向的锁JVM 会检查当前持有偏向锁的线程是否活跃。如果持有偏向锁的线程不活跃则可以将锁重偏向至新的线程如果持有偏向锁的线程还活跃则需要撤销偏向锁升级为轻量级锁。
②、偏向锁的轻量级锁
进行偏向锁撤销时会遍历堆栈的所有锁记录暂停拥有偏向锁的线程并检查锁对象。如果这个过程中发现有其他线程试图获取这个锁JVM 会撤销偏向锁并将锁升级为轻量级锁。
当有两个或以上线程竞争同一个偏向锁时偏向锁模式不再有效此时偏向锁会被撤销对象的锁状态会升级为轻量级锁。
③、轻量级锁到重量级锁
轻量级锁通过线程自旋来等待锁释放。如果自旋超过预定次数自旋次数是可调的并且自适应的表明锁竞争激烈轻量级锁的自旋已经不再高效。
当自旋等待失败或者有线程在等待队列中等待相同的轻量级锁时轻量级锁会升级为重量级锁。在这种情况下JVM 会在操作系统层面创建一个互斥锁Mutex所有进一步尝试获取该锁的线程将会被阻塞直到锁被释放。
参考小米员工薪酬范围占比一览表