2

为清楚起见重新措辞

我希望能够通过在适当的时候直接调用 lock 和 release 方法来混合使用同步块和更明确的锁定。因此,当我可以摆脱它时,允许我使用 sychtronized(myObject) 的语法糖,但也能够在同步块不够灵活以执行我需要的时候直接调用 myObject.lock 和 myObject.unlock完毕。

我知道每个对象都隐含地内置了一个租用锁,供同步块使用。实际上,每次进入同步块时,都会在对象内部可重入锁上调用锁定方法,而当您离开同步块时,会在同一个可重入锁上调用解锁。我似乎很容易让一个人能够手动锁定/解锁这个隐式重入锁;因此允许混合同步块和显式锁定。

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

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

4

1 回答 1

4

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

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

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

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

JLS的第 17 章描述了更多关于预期行为的信息。

于 2013-04-10T17:09:26.163 回答