最通俗易懂的synchronized原理解析
程序员文章站
2022-04-02 21:13:44
...
之前有文章写过synchronized的作用,这里不多说了,直接开始讲原理。
synchronized是Java的内置锁,是重量级锁,也是可重入锁。性能上不如Lock这种显示锁,而且缺乏许多功能,但是其优点是使用便捷。
首先看一段代码及其字节码:
public class SynchronizedTest {
public synchronized void fun1(){
}
public void fun2(){
synchronized (this){
}
}
}
(一)可以看到当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内部的对象 作为锁对象。