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

时间:2011-09-22 10:21:09

标签: java synchronization locking

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

以下是示例代码

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

}

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

1 个答案:

答案 0 :(得分:14)

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

如果您锁定this(这是我假设您所指的“内在锁定”),那么其他代码可以执行:

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

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

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