最通俗易懂的synchronized原理解析

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值