gpt4 book ai didi

java - Lock 是否保证 happens-before 关系?

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:31 25 4
gpt4 key购买 nike

我对 Java 中的代码重新排序和竞争条件有疑问。

假设我有以下代码,有 2 个或更多线程同时执行 workForThread():

public class Job {
private Lock lock = new ReentrantLock();
private int sharedObject = 1;
public void workForThread() {
lock.lock();
try {
sharedObject++;
} finally {
lock.unlock();
}
}
}

JVM 是否有可能以错误的顺序执行它?例如,是否可以进行以下重新排序?:

sharedObject++;
lock.lock();
lock.unlock();

或者保证锁不会被重新排序?

最佳答案

让我们看一下 Java 文档Lock 接口(interface)的看法:

All Lock implementations must enforce the same memory synchronization semantics as provided by the built-in monitor lock, as described in section 17.4 of The Java™ Language Specification:

A successful lock operation has the same memory synchronization effects as a successful Lock action.

A successful unlock operation has the same memory synchronization effects as a successful Unlock action.

所以你的问题的答案是肯定的。 Lock 为您提供与常规 synchronized block /方法相同的重新排序保证。

关于java - Lock 是否保证 happens-before 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42290869/

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