synchronized
2022-06-23 13:16:20 0 举报
syncronized锁状态转换及等待唤醒流程
作者其他创作
大纲/内容
创建对象
偏向锁状态偏向线程id锁标识:101
synchronized的等待唤醒机制(Monitor)
zhangzhifeng
入口等待队列_cqx
进入同步代码块
释放锁
synchronized锁状态变化
其他线程进入同步代码块CAS获取锁失败
线程栈
开启偏向锁并且超偏向锁延迟时间(默认4秒)
1.锁粗化:同一个线程反复进行获取锁和释放锁 (StringBuffer.append(\"a\").append(\"b\
调用wait线程队列_waitSet
调用notify
调用HashCode
新线程插入到队列头节点中所以syncronized是非公平锁
未开启偏向锁或者在延时偏向时间内
持有锁线程
代码验证:com.jvm.obj.SynchronizedTest
* 偏向锁撤销次数存在对象头markWork中的epoch中
线程重入获取锁和第一次一样生成两个对象但是不会保存markword
nullpoint
匿名偏向状态(偏向线程ID为空)锁标识: 101
轻量级锁状态锁标识: 000
准备执行队列(等待唤醒)Entry_List
调用hashCode偏向锁撤销转重量级锁
释放锁唤醒队列中第一个节点如果队列为空则将_cqx队列中数据放入Entry_list在进行唤醒
线程竞争
markword
线程进入同步代码块
无锁状态锁标识: 001
无锁/偏向锁状态使用对象头重的markwod字段保存
轻量级锁状态保存
偏向锁无法存储hashcode所以直接偏向锁撤销转无锁
线程第一次获取锁会在线程栈中生成一个保存markword的对象以及指向对象的指针并将markword指向线程栈中保存锁信息的对象地址
重量级锁使用监视器(管程)Monitor保存(AQS调度机制思想同步)
markwordpoint
JVM 对synchronized的优化
重量级锁状态锁标识: 010
对象头markword
notifiy随机获取一个/notifyAll全部放入Entry_List队列中
收藏
0 条评论
下一页