繁体   English   中英

为什么我不能直接访问(并锁定)对象用于同步块的隐式锁

[英]Why can't I directly access (and lock) the implicit lock that Objects use for synchronized block

为清楚起见改写

我希望能够通过在适当的时候直接调用锁和释放方法来将同步块的使用与更显式的锁混合使用。 因此,当我可以使用sychtronized(myObject)时,可以使用语法上的优势,但是当同步块不够灵活而无法执行我所需的时间时,也可以分别调用myObject.lock和myObject.unlock完成。

我知道每个对象都暗含一个内置的租用锁,该锁由同步块使用。 实际上,每次进入同步块时,锁方法都会在对象内部可重入锁上进行计算,并且在离开同步块时,将在同一可重入锁上调用解锁。 我似乎似乎很容易允许手动锁定/解锁这种隐式可重入锁定; 因此,允许混合使用同步块和明确锁定。

但是,据我所知没有办法做到这一点。 而且由于同步块的工作方式,我不相信有一种方便的方法可以将它们与显式锁定的齿形相混合。 似乎这将是相当方便的,并且可以通过扩展Object api来添加锁定/解锁方法来轻松添加。

我的问题是,为什么不存在? 我确定是有原因的,但是我不知道这是什么。 我认为问题可能与封装有关。 同样的原因,你不想做同步(这个)。 但是,如果我已经在调用sycnhronized(myObject),那么通过定义,任何了解myObject的人都可以在其上进行同步,并且如果愚蠢地进行操作也会导致死锁。 封装问题归结为谁可以访问同步的对象,而不管您使用同步块还是手动锁定对象。 至少在我看来。 那么,不允许人们手动锁定对象还有其他好处吗?

某个对象的锁与实例本身紧密相关。 synchronized块和方法的结构非常严格。 如果作为程序员,您有可能干扰系统(虚拟机),则可能会导致严重的问题。

  • 您最终可以释放由synchronized块创建的锁
  • 您创建另一个synchronized块将释放的锁
  • 您创建的锁条目多于出口
  • 您创建的锁出口多于条目

甚至为lockrelease操作定义了特定的字节码。 如果对此锁定/解锁操作有“方法”,则应将其编译为这些字节码。 因此,这实际上是一个低级操作,与其他Java对象级实现有很大不同。

同步是一个非常强大的契约。 我认为JLS的设计者不想让这种合同违约的可能性。

JLS第17章详细介绍了预期的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM