2013-04-10 70 views
2

改写为清楚的对象使用了synchronized块隐式锁我为什么不能直接访问(和锁)

我想能够使用synchronized块有更明确的锁定混合通过在适当时直接调用锁定和释放方法。因此,当我可以脱身使用sychtronized(myObject)时,允许我使用sysyxtically的syntaxtical糖,但也可以调用myObject.lock & myObject.unlock在当一个同步块的灵活性不足以满足我需要的时候完成。

我知道每一个对象都隐含着一个内置于其中的由同步块使用的租赁锁。实际上,每次进入同步块时,对象内部的可重入锁都会锁定锁方法,并且当您离开同步块时会在同一个可重入锁上调用解锁。我似乎很容易让一个人能够手动锁定/解锁这个隐式的可重入锁;从而允许混合同步块并显示锁定。

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

我的问题是,为什么不存在?我确定有一个原因,但我不知道它是什么。我认为这个问题可能与封装有关;同样的原因,你不想做同步(这)。然而,如果我已经调用了sycnhronized(myObject),那么通过定义,任何知道myObject的人都可以同步它,并在愚蠢的情况下导致死锁。封装问题取决于谁可以访问您同步的对象,而不管您使用sychtronized块还是手动锁定对象;至少在我看到它的时候。那么是否还有其他一些优势不允许手动锁定对象?

+0

只是要清楚(并防止像我现在删除的和其后的那个答案),你说你想在同一台显示器上同步,但你**不要**想要使用'synchronize'语句。你希望(有效地)获得某种监视器对象,并调用一个'lock'方法,执行其他逻辑并调用'release'。所以这不是关于同步方法与同步块的问题,而是关于通过显式“锁定”和“释放”“调用”来使用同一监视器的问题。 – 2013-04-10 13:32:28

+0

现在我不确定他想知道什么,最后一段作为一个高级面向对象设计主题是有意义的,第一段是初学者在线程安全方面的问题;在他的中间段,他讲述了sycronized的块,他可能意味着同步的方法,或者同步这个。所有有点混淆 – AlexWien 2013-04-10 13:51:38

+0

是TJ,我在问你在说什么。对不起,如果我没有说好,我想不出如何表达我想要的东西 – dsollen 2013-04-10 16:17:06

回答

4

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

  • 你最终可能释放是由​​块中创建一个锁
  • 您创建一个锁定另一个​​块将释放
  • 您创造更多的锁定退出你创造出比出口更锁条目比条目

甚至还有为lockrelease操作定义的特定字节码。如果您对此锁定/解锁操作有“方法”,则应将其编译为这些字节码。所以,它实际上是的一个低级操作,并且与其他Java对象级别的实现非常不同。

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

Chapter 17 of the JLS描述了有关预期行为的更多信息。

相关问题