大家好,每当我使用同步语句时,我经常使用这种模式:
private static Object lock = new Object();
public void F(){
//..
synchronized (lock){
//..
}
//..
}
然而,在java.lang.Reference
的来源中,我看到他们改用这种模式:
static private class Lock { };
private static Lock lock = new Lock();
public void run() {
//..
synchronized(lock){
//..
}
//..
}
我想知道声明一个新类 Lock(它基本上扩展了 Object 而什么都不做)有什么好处?
或者更确切地说,他们为什么不简单地使用 private static Lock lock = new Object();
?
最佳答案
以下代码:
synchronized(lock){
}
实际上并没有使用 Lock
机制,您只是在 Object
上使用内置的同步功能。在这种情况下,您还不如使用普通的旧 Object
。扩展 Object
的锁定对象的一个好处是,它会在调试工具中显示类名,而不仅仅是普通的 Object
,这在查找时更有帮助死锁。
参见 here用于 Lock
API。
Lock
的好处是您可以获得更多功能,例如能够“尝试”锁定,然后在失败时继续执行代码。此外,它具有与同步块(synchronized block)不同的属性,因为它是不可重入的(一个线程不能在同一个锁上持有多个锁,然后释放它们)。如果您想要那样的东西,您可以使用 ReentrantLock
。
您还有更酷的锁,例如 ReentrantReadWriteLock
,它支持多个读取器,但一旦写入器锁定它,就不允许读取器。那里有一个针对不同类型应用程序的大锁生态系统。
关于java - 创建一个 "Lock"类(它扩展了 Object 并且什么都不做)有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8388763/