在阅读有关同步的内容时,我遇到了封装可变状态的“监视器模式”。
下面是示例代码
public class MonitorLock {
private final Object myLock = new Object();
Widget widget;
void someMethod() {
synchronized(myLock) {
// Access or modify the state of widget
}
}
用私有(private)锁代替内在锁在任何方面都更好吗?
最佳答案
是的 - 这意味着您可以看到所有可能获得该锁的代码(抛开反射的可能性)。
如果您锁定this
(我假设您指的是“内在锁”),那么其他代码可以执行以下操作:
MonitorLock foo = new MonitorLock();
synchronized(foo) {
// Do some stuff
}
此代码可能与 MonitorLock
本身相去甚远,并且可能会调用其他方法,这些方法又会移除监视器。在这里很容易陷入死锁,因为您无法轻易看出什么将获得哪些锁。
使用“私有(private)”锁,您可以很容易地看到获得该锁的每一段代码,因为它们都在MonitorLock
中。因此更容易推断出该锁。
关于java - 为什么使用私有(private)锁而不是内部锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7513227/