synchronized原理

对象头 (markword,数组长度,类型指针)   实例数据 (字段1,字段2)  对齐填充 (对其字节)

synchronized修饰方法 多了一个ACC_SYNCHRONIZED 标识符

synchronized修饰代码块 monitorenter和monitorexit

ObjectMonitor里_EntryList和_WaitSet

1.线程在竞争synchronized锁的时候,jvm首先会检查偏向锁的标记位和锁的标记位,判断当前锁是否处于可偏向的状态

2争抢synchronized锁的线程检查锁对象的MarkWord中存储的线程ID是否是自己的线程ID,如果是,在表示处于偏向锁状态,当前线程可以直接执行

3如果锁对象的MarkWord中存储的线程ID不是当前线程,则通过CAS的自旋的方式竞争,如果竞争成果,设置MarkWord的线程ID和偏向锁的标记位和锁的标记位

4如果CAS竞争失败,撤销偏向锁,升级位轻量级锁

5当前线程会把锁对象的MarkWord的线程ID暂停。

6当前线程后上次获取锁的线程开始CAS自旋争锁

7竞争锁成功过的线程获取到锁,修改锁的标识位,进入轻量级锁的状态

8竞争失败的线程会继续用CAS自旋竞争锁,如果自旋成功,还是轻量级锁的状态

9如果CAS自旋一定次数还没有获取到锁,则膨胀位重量级锁,进入重量级锁的状态

 

posted @ 2024-05-28 18:15  沙漠里的小鱼  阅读(3)  评论(0编辑  收藏  举报