synchronezed
进出同步代码块时会进行内核态到用户态的切换,所以1.8进行了优化,将锁分为4个级别:无锁、偏向锁、轻量级锁、重量级锁(对象头的Mark Word里做标记)
Mark Word中标志 存储内容 01,0 未锁 hashCode、分代 01,1 可偏向锁 偏向第一个访问的线程线id、时间戳 00 轻量锁 指向栈帧中的锁记录 10 重量锁 互斥锁,指向ObjectMonitor(有阻塞队列WaitSet, 等待队列EntryList, owner, count) 11 GC标记
- 无锁->偏向锁
- 一个线程看到对象头的无锁标记时,就CAS把自己的线程ID写入Mark Word,变成偏向锁,把原先的保存在栈中备份;
- 无锁->轻量级锁(未开启偏向)
- 发现未锁,拷贝Mark Word到自己的锁记录中,CAS更新Mark Word指向锁记录
- 成功——》持有轻量锁
- 失败——》检测Mark Word是否指向自己的栈
- 指向ÿ