gpt4 book ai didi

java - 创建一个 "Lock"类(它扩展了 Object 并且什么都不做)有什么好处?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:16:22 26 4
gpt4 key购买 nike

大家好,每当我使用同步语句时,我经常使用这种模式:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com