最通俗易懂的synchronized原理解析

时间:2021-10-12 14:46:27

之前有文章写过synchronized的作用,这里不多说了,直接开始讲原理。

synchronized是Java的内置锁,是重量级锁,也是可重入锁。性能上不如Lock这种显示锁,而且缺乏许多功能,但是其优点是使用便捷。

首先看一段代码及其字节码:

public class SynchronizedTest {

public synchronized void fun1(){

}

public void fun2(){
synchronized (this){

}
}
}

最通俗易懂的synchronized原理解析

(一)可以看到当synchronized修饰代码块时,会先执行monitorenter,退出时会执行monitorexit。

这里就要说到Java的内置监视器Monitor了,每个对象都有一个内置监视器Monitor,内部有一个计数器。

1、若计数器的值为0,则说明没有线程进入,当前线程可以成为Monitor的持有者,进入代码块,计数器+1。

2、若当前线程持有该Monitor,且计数器不为零,则可重入,计数器加一。

3、当前线程执行完该代码块,执行monitorexit语句,计数器减一。

4、若线程既没有持有monitor,计数器值也不为零,则进入阻塞状态,等待其他线程释放锁。

(二)synchronized修饰方法时,并没有显示的写出moniter的操作,而是在该Class文件的方法表中将该方法的access_flags字段中的synchronized的标志位置为1,表示该方法是同步对象,并且使用该方法的对象(非static方法)或使用该方法的对象所属的Class在JVM内部的对象 作为锁对象。