为清楚起见重新措辞
我希望能够通过在适当的时候直接调用 lock 和 release 方法来混合使用同步块和更明确的锁定。因此,当我可以摆脱它时,允许我使用 sychtronized(myObject) 的语法糖,但也能够在同步块不够灵活以执行我需要的时候直接调用 myObject.lock 和 myObject.unlock完毕。
我知道每个对象都隐含地内置了一个租用锁,供同步块使用。实际上,每次进入同步块时,都会在对象内部可重入锁上调用锁定方法,而当您离开同步块时,会在同一个可重入锁上调用解锁。我似乎很容易让一个人能够手动锁定/解锁这个隐式重入锁;因此允许混合同步块和显式锁定。
但是,据我所知,没有办法做到这一点。而且由于同步块的工作方式,我不相信有一种方便的方法可以将它们与显式锁定混合在一起。似乎这会很方便,并且可以通过扩展 Object api 来添加锁定/解锁方法来轻松添加。
我的问题是,为什么这不存在?我确定有一个原因,但我不知道它是什么。我认为问题可能与封装有关;同样的原因你不想做同步(这个)。但是,如果我已经在调用 sycnhronized(myObject) ,那么根据定义,任何了解 myObject 的人都可以在其上进行同步,如果愚蠢地执行会导致死锁。封装的问题归结为谁可以访问您同步的对象,无论您使用的是同步块还是手动锁定对象;至少在我看来。那么不允许手动锁定对象还有其他好处吗?