Synchronized 用过吗,其原理是什么?

这是一道 Java 面试中几乎百分百会问到的问题,因为没有任何写过并发程序的开发者会没听说或者没接触过 Synchronized。

Synchronized 是由 JVM 实现的一种实现互斥同步的一种方式,如果 你查看被 Synchronized 修饰过的程序块编译后的字节码,会发现, 被 Synchronized 修饰过的程序块,在编译前后被编译器生成了

monitorenter 和 monitorexit 两 个 字 节 码 指 令 。

这两个指令是什么意思呢?

在虚拟机执行到 monitorenter 指令时,首先要尝试获取对象的锁。

如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁 的计数器 +1;

当执行 monitorexit 指令时将锁计数器 -1;当计数器 为 0 时,锁就被释放了。 如果获取对象失败了,那当前线程就要阻塞等待,直到对象锁被另外一 个线程释放为止。
Java 中 Synchronize 通过在对象头设置标记,达到了获取锁和释放 锁的目的。

回复

我来回复
  • 暂无回复内容

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部