jdk1.6升级
无锁 <-> 偏向锁 -> 轻量级锁 ----(自旋)---> 重量级锁
1、无锁 001
2、偏向锁101
适用于一个线程反复获得锁
默认JDK1.6开启,但不是立即使用有个时间,markword里面保存线程id
3、轻量级锁00
适用于多个线程有序获得锁
由偏向锁 -> 无锁 -> 轻量级锁
lock record:
dispather hdr : 用于保存markword里面的hashcode、age...(重入是null)
owner : 指向heap中的对象
4、自旋过程
JDK1.6默认开启,开始默认是10次,但是会只能优化
5、重量级锁
锁膨胀:轻量级锁变为重量级锁
Monitor:
waitSet: 指向被wait的线程 EntryList( + cxq):链表、被阻塞的线程 owner:当前获得锁的线程 阻塞线程不会立即进入EntryList,会现在cxq中,然后下一次又竞争上才进入
唤醒线程的时候有不同的策略从cxq和EntryList中唤醒:
cxq、cxq+EntryList头、cxq+EntryList尾
6、其他优化
锁消除:逃逸分析没事儿就不加锁 锁粗化:for循环中有锁优化在外边