为了清晰起见而改写
我希望能够通过在适当的时候直接调用锁定和释放方法,将synchronized块的使用与更明确的锁定混合使用。因此允许我使用sychtronized(myObject)的合成糖,当我可以逃脱它,但也能够调用myObject.lock&对于那些同步块不够灵活以完成我需要做的事情的时候,myObject.unlock是dierctly。
我知道每个Object隐含地都有一个嵌入其中的租用锁,它由synchronized块使用。每次进入同步块时,有效地锁定对象内部可重入锁定的锁定方法,并在离开同步块时在同一可重入锁定上调用解锁。我觉得好像很容易让人能够手动锁定/解锁这个明显的重入锁定;因此允许混合同步块和explcit锁定。
然而,据我所知,没有办法做到这一点。并且由于同步块的工作方式,我不相信有一种方便的方法将它们与显式锁定othewrise混合。这似乎是一个相当方便,并通过扩展Object api添加锁定/解锁方法轻松添加。
我的问题是,为什么不存在?我确定有一个原因,但我不知道它是什么。我认为这个问题可能与封装有关;同样的原因,你不想做同步(这)。但是,如果我已经调用了sycnhronized(myObject),那么通过定义任何知道myObject的人都可以同步它并导致死锁,如果做得很愚蠢。封装的问题归结为谁可以访问您同步的对象,无论您使用sychtronized块还是手动锁定对象;至少我认为如此。那么不允许手动锁定对象还有其他一些优点吗?
答案 0 :(得分:4)
某个对象的锁与实例本身高度相关。 synchronized
块和方法的结构非常严格。如果您作为程序员,可能会干扰系统(虚拟机),则可能会导致严重问题。
synchronized
块synchronized
块将会释放的锁甚至为lock
和release
操作定义了特定的字节码。如果你有一个"方法"对于此锁定/解锁操作,应将其编译为这些字节码。因此,真的是一个低级操作,与其他Java对象级实现非常不同。
同步是一个非常强大的合同。我认为JLS的设计者不希望允许破坏这份合同。
Chapter 17 of the JLS详细介绍了预期的行为。