-
轻量级锁:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。
-
进行加锁操作时,会在当前线程的栈帧中划分一块空间存储锁记录,内部存储锁对象的Mark Word信息。
-
让锁记录中的Object reference指向锁对象,并尝试用CAS将锁对象的Mark Word替换锁记录的指针。
-
如果CAS成功,对象头中会存储锁记录地址与其状态标志00,表示此对象处于轻量级锁状态。
-
如果CAS失败,有两种情况:
-
如果其他线程已经持有了该对象的轻量级锁,则表明有竞争,进入锁膨胀过程。
-
如果发现是自己持有表明进行了锁重入,在锁记录中添加一条值为null的锁记录作为重入的计数。
这个过程可以通过偏向锁优化:如果锁重入时发现是自己持有,则锁归该线程所有,后续不发生竞争的话就不用重新CAS。
-
-
-
重量级锁:轻量级锁经历锁膨胀变成重量级锁。
- 线程1进行加锁时发现锁对象已经被线程0占有,这时线程1加轻量级锁失败,进入锁膨胀过程。
- 然后为锁对象申请Monitor,并使锁对象指向它。
- 然后自己进入Monitor的EntryList队列等待。
- 这个过程可以通过自旋进行优化,当获取锁失败时会进行自旋重试,默认为10次,如果自旋成功就可以避免线程进入阻塞状态。
synchronized锁升级流程(轻量级锁,重量级锁,偏向锁,锁膨胀,自旋)
最新推荐文章于 2023-06-25 10:03:15 发布