轻量级锁

轻量级锁

 

轻量级锁适用于线程数量少且执行时间短的代码块。在线程还未得到CPU调度时,首先会在该线程的栈中开启一块区域作为lock record,然后将对象头的 Mark Word 部分拷贝到 lock record 位置,然后尝试将对象对象头 Mark Word 轻量级锁部分的指向栈的指针指向自己线程的lock record,如果成功就表明该线程得到了锁,CPU就会调度。详细的执行过程是:

1.如果这个对象锁是刚刚升级到轻量级锁且锁对应对象的mark word的偏向锁部分存储的 threadId 对应的线程没有执行完当前对应的代码,那么系统就会先将CPU交给 threadId 对应的线程,让他先执行完。过程就是先在该线程的栈中开启一块区域作为lock record,然后将mark word拷贝到 lock record,再将轻量级锁部分的指针指向 lock record。随后开始执行锁修饰的代码块,执行完毕后会进行两次检查:1.对象头的Mark Word中锁记录指针是否还是指向当前线程的lock record部分 2.lock record是否还与对象头的Mark Word一致。如果一致,就释放锁资源。如果不一致就将锁升级为重量级锁,然后释放。

2.如果是普通的线程,那么首先还是在当前线程的栈中开启一块区域作为lock record,然后将对象头的 Mark Word 部分拷贝到 lock record 位置,然后尝试将对象对象头 Mark Word 轻量级锁部分的指向栈的指针指向自己线程的lock record,

1.如果成功,就继续执行后面代码,

2.如果失败就以自旋锁方式继续尝试,

1.如果一定次数还是没有获取到锁,那么就将锁膨胀为重量级锁。

2.如果成功执行锁修饰的代码,执行完会再进行两个检查,如果符合就释放锁。不符合就膨胀成重量级锁,然后再释放。