synchronized修饰的对象lock在做交换时:
首先在线程中创建一个锁记录 ,lock对象的头markword和
如上图:lock记录有一个指针指向对应的对象的地址,首先判断flag==01? 如果flag为00,那么表示这个锁被其他线程占用,如果为01,那么可以执行markword和lock record的交换操作,并且置flag==00,后面的线程如果想获得锁就不能获得了,因为flag==00;当synchronized中的代码执行完,会执行锁对象的解锁操作:交换lock对象中的头部信息和lockrecord中的头部信息,并且恢复flag==01.
锁重入:线程中的部分代码也使用同一个lock对象修饰,那么就会发生锁重入,锁重入不会发生lock对象和新的lockrecord头部的交换,因为此时flag==00.
重量级锁:thread01线程申请锁失败,为lock对象申请一个Monitor锁(重量级锁),并且使当前的lock对象头部(最初为Mark word所在的位置)指向Monitor锁,并且让owner指向锁记录:因为轻量级锁不能有等待队列