首页  

synchronized知识点     所属分类 java 浏览量 1363
修饰静态方法 实例方法 
代码块

修饰方法, 方法访问标识中设置ACC_SYNCHRONIZED
monitor
monitorenter monitorexit 指令

锁优化
自旋锁、自适应自旋锁、锁粗化、锁消除、偏向锁、轻量级锁

锁的四种状态:无锁 偏向锁 轻量级锁 重量级锁

对象  对象头 + 实例数据 + 对齐填充 

对象头

锁状态 是否是偏向锁 锁标志位
重量级锁 指向重量级锁Monitor的指针 
轻量级锁 指向线程栈中锁记录的指针 pointer to Lock Record
偏向锁 线程ID
无锁 hashCode 对象分代年龄
metadata元数据指针  数组长度(数组对象才有)

当处于无锁状态时,对象头中存储的是java对象的hashCode,
当出现一个线程获取这个锁时,由无锁状态升级为偏向锁,偏向锁标识由0变为1,对象头中记录线程ID,
此时如果有其他线程来获取这个对象,在竞争不激烈的情况下,可以通过自旋获取这个偏向锁,通过CAS修改对象头中的线程ID.
如果竞争激烈,自旋多次都无法获取,则升级为轻量级锁,修改锁标识位,并修改对象头中的内容指向线程栈中锁记录的指针.
如果此时依旧无法获取到锁,则表明竞争非常剧烈,此时升级为重量级锁,修改锁标识位并阻塞当前线程.
jdk1.6之前默认为重量级锁,所以性能消耗大

Lock Record
在线程执行同步块之前会在当前线程的栈帧中创建一个Lock Record,其中包括一个指向对象头Mark Word的指针.
一个同步块对应一个Lock Record
Mark Word中记录指向Lock Record的指针

线程的Lock Record  和 对象头 互相 指向

重量级锁  Mark Word中记录一个指向Monitor的指针

Monitor

The Owner 中为持有锁的线程
Entry Set 存放所有阻塞的线程
Wait Set 为等待状态的线程

上一篇     下一篇
linux运维知识点

java中创建对象的五种方式

java有意思的陷阱

TCP 重传 滑动窗口 流量控制 拥塞控制

tomcat 热加载 热部署

arthas 使用 ognl 设置日志级别