synchronized 是JVM基于进入和退出Monitor对象来实现同步的。Monitorenter和monitorexit指令。
jDK1.6为了优化锁引入了偏向锁和轻量级锁。
1、偏向锁:
检查对象头Markword是否存储了线程的ID,如果进行CAS尝试把对象头mark word替换为自己线程ID。
偏向锁撤销:再有一个线程CAS 对象头 Mark word 到线程ID 失败,在安全点进行撤销原线程的偏向锁为无锁。
2、轻量级锁:1)、在线程栈创建存储锁记录的空间并把对象头的 Mark word复制到锁记录,2)、尝试进行CAS把对象头的Mark word替换为指向指向锁记录的指针。
如果不能通过CAS把对象头Mark word替换为指向锁记录的指针,进行自旋获得锁。如果自旋多次还没有获得进行膨胀为重量级锁。
锁释放:使用CAS将存储在线程锁空间的Mark word替换回对象头,如果失败说明已经升级为重量级锁,会唤醒阻塞队列里的线程。