Java Synchronized

88 阅读1分钟

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循环中有锁优化在外边