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

标签 java multithreading concurrency

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

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/

相关文章:

java - Eclipse tycho 将版本更新为 svn 修订版

java - 将所有美元计算转换为欧元的最简单方法? (java)

java - 多个弹跳球线程问题

c - 使用多线程计算数据但并没有减少时间

java - 为什么Spring MVC会以404响应并报告“在DispatcherServlet中未找到带有URI […]的HTTP请求的映射”?

java - JSON 对象和 Spring @RequestParam

c# - 在循环中顺序执行函数而不阻塞ui

python - 如何在并发方法中使用集合和队列来验证已经完成的作业,以免再次对它们进行排队?

java - 寻找使用 Java Concurrency API 进行事件同步的干净解决方案

sql - 将 pg_try_advisory_xact_lock() 放在嵌套子查询中?