【回顾】对synchronized关键字底层原理的简单理解

一、基本用法

synchronized是用来保证线程间的同步的一个关键字;
类中包含的一段代码:
synchronized(myObject){
//代码
synchronized(myObject){
//代码
}
}
类中包含的另一段代码:
synchronized(otherObject.class){
}

可以对一个对象进行加锁,也可以对一个类进行加锁;

二、实现原理

在synchronized进行加锁的时候,会对应一个monitorenter加锁的指令,
加锁完毕之后会对应一个monitorexit释放锁的指令。

monitorenter的加锁过程:
加锁必然针对的是一个对象,而每个对象都有一个关联的monitor,如果要对这个对象加锁,就必须获取这个对象关联的monitor的lock锁;
monitor里面有一个计数器,是从0开始计数的,如果一个线程获取了该对象的monitor中的锁,先会去看看其计数器是否为0,为0的话就说明没有人获取该对象的锁;
如果发现计数器中的值是大于0的,则该线程加锁失败,进入blocked的阻塞状态。
【回顾】对synchronized关键字底层原理的简单理解_第1张图片

monitorexit释放锁过程:
此时获取锁的线程就会对那个对象的monitor的计数器减1,如果有多次重入加锁就会对应多次减1,直到最后,计数器是0。

你可能感兴趣的:(java,多线程,并发编程)