为什么我不能直接访问(并锁定)Objects用于synchronized块的隐式锁

时间:2013-04-10 13:18:59

标签: java synchronization locking blocking synchronized

为了清晰起见而改写

我希望能够通过在适当的时候直接调用锁定和释放方法,将synchronized块的使用与更明确的锁定混合使用。因此允许我使用sychtronized(myObject)的合成糖,当我可以逃脱它,但也能够调用myObject.lock&对于那些同步块不够灵活以完成我需要做的事情的时候,myObject.unlock是dierctly。

我知道每个Object隐含地都有一个嵌入其中的租用锁,它由synchronized块使用。每次进入同步块时,有效地锁定对象内部可重入锁定的锁定方法,并在离开同步块时在同一可重入锁定上调用解锁。我觉得好像很容易让人能够手动锁定/解锁这个明显的重入锁定;因此允许混合同步块和explcit锁定。

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

我的问题是,为什么不存在?我确定有一个原因,但我不知道它是什么。我认为这个问题可能与封装有关;同样的原因,你不想做同步(这)。但是,如果我已经调用了sycnhronized(myObject),那么通过定义任何知道myObject的人都可以同步它并导致死锁,如果做得很愚蠢。封装的问题归结为谁可以访问您同步的对象,无论您使用sychtronized块还是手动锁定对象;至少我认为如此。那么不允许手动锁定对象还有其他一些优点吗?

1 个答案:

答案 0 :(得分:4)

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

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

甚至为lockrelease操作定义了特定的字节码。如果你有一个"方法"对于此锁定/解锁操作,应将其编译为这些字节码。因此,真的是一个低级操作,与其他Java对象级实现非常不同。

同步是一个非常强大的合同。我认为JLS的设计者不希望允许破坏这份合同。

Chapter 17 of the JLS详细介绍了预期的行为。