Java并发常见锁

偏向锁

如果程序没有竞争,已获取锁的进行再执行时候,则会先将同步操作撤除掉,直到竞争出现(其他线程请求了锁),则退出偏向模式。

轻量级锁

如果退出偏向模式,则会升级为轻量锁模式

JVM会开辟一个锁记录空间。

对象尝试去获取锁,如果成功,则将对象mark word指向锁。即更新锁标识状态。

如果尝试将mark word指向锁标识失败。即更新失败,则查看是否对象本身已经拥有锁,否则则是锁被其他对象占用了。

如果有两个线程以上同时竞争,则锁会再升级为重量级锁。

轻量级锁并不会真正加锁,而是标识来控制

重量级锁

真正加锁的机制了~

自旋锁

获取锁失败时,不会挂起,而是会执行空循环,并尝试再重新获取锁。

可重入锁

只要线程获取了,一个对象的锁,那么该对象另一个同步机制也能直接放行获取锁。

这样可以避免死锁的发生。