你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁?

“锁”的本质其实是 monitorenter 和 monitorexit 字节码指令的一 个 Reference 类型的参数,即要锁定和解锁的对象。我们知道,使用Synchronized 可以修饰不同的对象,因此,对应的对象锁可以这么确定。

  1. 如果 Synchronized 明确指定了锁对象,比如 Synchronized(变量名)、Synchronized(this)等,说明加解锁对象为该对象。
  2. 如果没有明确指定:
    若 Synchronized 修饰的方法为非静态方法,表示此方法对应的对象为锁对象;
    若 Synchronized 修饰的方法为静态方法,则表示此方法对应的类对象为锁对象。
    注意,当一个对象被锁住时,对象里面所有用 Synchronized 修饰的方法都将产生堵塞,而对象里非 Synchronized 修饰的方法可正常被调用,不受锁影响。

回复

我来回复
  • 暂无回复内容

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

站长Johngo!

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

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

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部