java.util.concurrent API提供了一个名为Lock的类,它基本上会序列化控件以访问关键资源.给出了park()unpark()等方法.

如果我们可以使用synchronized个关键字,使用wait()notify() notifyAll()种方法,我们也可以做类似的事情.

我想知道其中哪一个在实践中更好,为什么?

推荐答案

如果您只是简单地锁定一个对象,我更喜欢使用synchronized

示例:

Lock.acquire();
doSomethingNifty(); // Throws a NPE!
Lock.release(); // Oh noes, we never release the lock!

你必须明确地在任何地方做try{} finally{}次.

而对于synchronized,它非常清晰,不可能出错:

synchronized(myObject) {
    doSomethingNifty();
}

这就是说,Lock对于更复杂的东西可能更有用,因为你不能以这种干净的方式获取和释放.老实说,我更愿意从一开始就避免使用赤裸裸的Lock,而只使用更复杂的并发控制,如CyclicBarrierLinkedBlockingQueue,如果它们能满足您的需求的话.

我从来没有理由使用wait()notify(),但可能有一些好的.

Java相关问答推荐

为什么从 Java 代码中提取 SQL Server 序列时会跳两个?

如何管理 Wordle Game (JavaFx) 中的重复字母?

Javax.swing 如何删除前一个矩形

判断映射值是否包含特定字符串和受限列表中的元素

如何总结具有特定 ID 的列表中对象的属性值并使用 Streams 将其分配给另一个对象

JVM字节码中的“dup2_x2”指令有什么用?

Stream API - 如果 filter() 紧随其后, sorted() 操作如何工作?

Do...while 在输入验证中不起作用

0 到 1000 的随机数 Math.random()

春天卡夫卡 |如何使 DeserializationException 可重试?

Java 8 DateTimeFormatter 解析在future 很远的 ISO 日期失败

打印所有可以使用 `+` 或 `-` 运算符给出给定数字的组合

Spring OAuth 2.0 with jersey request:输入正确凭据后响应 401 Unauthorized

再次“过时的元素引用:元素未附加到页面文档”

Android - 中止崩溃

org.apache.kafka.common.errors.SerializationException:未知的魔术字节

使用 lambda 函数对数组列表进行排序不起作用

查找有向图中的所有循环,包括后边

如何使用一个对象的多个属性并将其映射到另一个对象中的一个?

如何将 @RestController 添加到 spring-webflux 应用程序?