欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最通俗易懂的synchronized原理解析

程序员文章站 2022-04-02 21:13:44
...

之前有文章写过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内部的对象 作为锁对象。