如果程序没有竞争,已获取锁的进行再执行时候,则会先将同步操作撤除掉,直到竞争出现(其他线程请求了锁),则退出偏向模式。
如果退出偏向模式,则会升级为轻量锁模式
JVM会开辟一个锁记录空间。
对象尝试去获取锁,如果成功,则将对象mark word指向锁。即更新锁标识状态。
如果尝试将mark word指向锁标识失败。即更新失败,则查看是否对象本身已经拥有锁,否则则是锁被其他对象占用了。
如果有两个线程以上同时竞争,则锁会再升级为重量级锁。
轻量级锁并不会真正加锁,而是标识来控制
真正加锁的机制了~
获取锁失败时,不会挂起,而是会执行空循环,并尝试再重新获取锁。
只要线程获取了,一个对象的锁,那么该对象另一个同步机制也能直接放行获取锁。
这样可以避免死锁的发生。