为什么使用私有锁而不是内部锁?

在阅读同步时,我遇到了“监控模式”来封装可变状态。

以下是示例代码

public class MonitorLock { private final Object myLock = new Object(); Widget widget; void someMethod() { synchronized(myLock) { // Access or modify the state of widget } } 

}

以任何方式更好地拥有私人锁而不是内在锁吗?

是的 – 这意味着你可以看到所有可能获得锁定的代码 (不考虑reflection的可能性)。

如果您锁定this (这是我假设您通过“内部锁定”引用),那么其他代码可以执行:

 MonitorLock foo = new MonitorLock(); synchronized(foo) { // Do some stuff } 

此代码可能距离MonitorLock本身很远,可能会调用其他方法,而这些方法又会取出监视器。 这里很容易陷入死锁区域,因为你无法轻易看到将会获得哪些锁定。

使用“私有”锁定,您可以轻松查看获取该锁定的每一段代码 ,因为它们都在MonitorLock 。 因此,更容易推断锁定。