围绕synchronize关键字说下三个锁升级
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁
1,Mark Word
2,指向类的指针
3,数组长度(只有数组对象才有)
锁的信息都是放在对象头的mark word里面的,具体信息如下:
【说个小知识点 yc的年龄最大的是15 cms默认的是6,4bit的最大就是15】
1.无锁态,一个对象没有被争抢,里面会记录对象的hash等信息
2.有线程来争抢,抢到锁后jvm会把持有锁的线程id记录到mark word里面。针对可重入锁 或者并发小的情况,偏向锁还是蛮好的。并发度比较大的情况下,需要停止偏向锁。 -usebiasedLock。
3.多线程争抢时 会升级成轻量级锁,这个时候争抢锁的线程会在自己的线程栈里面生成lockRecord(里面会记录原先 hashcode的信息)大家通过cas来更新mark word里面的信息
4.自旋次数到达10次,或者会升级成重量级锁。 重量级锁就动用到了操作系统的原语。java变异看到的就是 monitorEnter monitorExist。这个时候锁是由操作系统来分配的,不同的操作系统 底层的指令也不是相同的(轻量级锁为啥要升级成重量级锁 还是比较简单的,这个可以想下)