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自旋一定次数还没有获取到锁,则膨胀位重量级锁,进入重量级锁的状态