gpt4 book ai didi

Java 并发 :Is ReentrantLock a wrong design?

转载 作者:行者123 更新时间:2023-12-03 10:58:42 24 4
gpt4 key购买 nike

我知道ReentrantLock使用AbstractQueuedSynchronizer(AQS)来实现Lock。但是实现的细节,我看不懂。

我知道 AQS 使用 volatile、CAS 和自旋来进行同步。但是,这些操作只控制“状态”成员。

不过,LockSupport.parkLockSupport.unpark可以同步线程的cacheline。但是,如果从不存在争用,则永远不会调用 LockSupport 方法。像这样:1.线程A启动并运行

2.线程B启动并运行

3.线程A:

lock.lock();
try{
//modify some shared members
....
}finally{
lock.unlock();
}

4.然后线程B:

lock.lock();
try{
//read shared members
....
}finally{
lock.unlock();
}

没有争用,线程 B 没有调用 LockSupport 方法。

lock.lock()CAS“state”成员,而lock.unlock()修改volatile“state”为0 .

为什么线程B可以看到线程A对共享成员的修改?

为什么ReentrantLock可以作为“同步”使用?

我没有看到像fullFence这样的代码来同步内存。

哪些代码实现了线程缓存行的同步?

谢谢!

最佳答案

CAS 操作定义了happens-before 关系,因此 Java 内存模型保证一个线程的内存修改对另一个线程可见。

关于Java 并发 :Is ReentrantLock a wrong design?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42966669/

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