gpt4 book ai didi

java - 使用volatile和atomic会不会一直保证线程安全

转载 作者:行者123 更新时间:2023-11-30 06:22:48 24 4
gpt4 key购买 nike

每当我寻找并发访问时,我都会得到不同的答案,JCIP 书我已经订购并且正在路上,但我想确定我的并发基础知识,这是我的场景

我有 3 个线程。一个线程负责建立连接并创建一个单例连接对象实例。另外两个线程将不停地发送数据。

现在其他线程将等待 CountDownLatch,一旦建立连接,连接线程就会将其倒计时为零。

这是我在 ConnectStatus 类中声明的,希望 connected 变量同步并且对所有线程可见。

public class ConnectStatus {

public static final CountDownLatch connectionLatch = new CountDownLatch(1);
private static volatile AtomicBoolean connected;

}

我正在使用这个 connected 变量,它是可变的和原子的来维护连接状态。这样其他线程在发送数据之前就可以“始终”知道连接是否存在。

建立连接后,我将此 boolean 值设置为 true 并将锁存器设置为零。

ConnectStatus.connected.set(true);
ConnectStatus.connectionLatch.countdown();

现在其他线程将收到锁存器的通知,原子值也将为真,线程开始发送数据。

发送下面的数据线程片段。

if(ConnectStatus.connected.get()){

// send data

}

现在这是我的问题,连接可能随时变坏并断开连接,所以那个时候,我将我的原子 connected 设置为 false。我想知道的是,这个线程安全吗,我的其他线程是否总是会得到这个原子的、易变的变量的更新值?我需要其他两个线程在连接中断时停止发送数据。

if(ConnectStatus.connected.get()){

// send data

}

上面的代码片段总是能正常工作吗?

最佳答案

The connection can get bad and disconnected at anytime,so that time , I am making my atomic connected as false. What I would like to know is , Is this thread safe , will my other threads always get the updated value of this atomic , volatile variable ?

是也不是。首先,您的 AtomicBoolean 应该是 final不是 volatileAtomicBoolean 包装了一个 volatile boolean 但您不会将其更改为另一个 AtomicBoolean:

private static final AtomicBoolean connected = new AtomicBoolean(false);

仅使用 AtomicBoolean 来保护连接的问题是(正如@Jeff 提到的)即使您测试连接是否已连接,之后也可能会直接断开连接。

if (ConnectStatus.connected.get()) {
// disconnect happens here, before the send
// send data
}

您无法使用 AtomicBoolean 来防止这种断开连接。您需要有一个锁,以便断开连接的线程等待所有发送完成:

private final Object lock = new Object();
...
synchronized (lock) {
if (connected) {
sendData();
}
}
...
// this has to wait for the lock to be released before it can be closed
synchronized (lock) {
if (connected) {
disconnect();
connected = false;
}
}

如果您无法控制何时连接断开,那么您将必须正确捕获异常并适本地处理它们。

最后,如果您需要多个发件人,那么您应该查看 ReentrantReadWriteLock 并将您的发件人锁定为一次允许多个读者的“读者”(有趣),并关闭线程锁定为一次只允许一位作者的“作者”。

关于java - 使用volatile和atomic会不会一直保证线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18904678/

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