每当我寻找并发访问时,我得到的答案是复杂的
我有 3 个线程。一个线程负责建立连接并创建一个单例连接对象实例。另外两个线程将不断地发送数据。
现在,其他线程将等待CountDownLatch
连接线程一旦建立连接,连接线程将倒计时到零。
这是我在ConnectStatus
类中声明的内容,希望connected
变量同步并对所有线程可见。
public class ConnectStatus {
public static final CountDownLatch connectionLatch = new CountDownLatch(1);
private static volatile AtomicBoolean connected;
}
我正在使用这个connected
易失且原子的变量来维护连接状态。这样其他线程就可以在发送数据之前“始终”知道连接是否处于活动状态。
一旦我建立了连接,我将把这个布尔值设为真并将锁存为零。
ConnectStatus.connected.set(true);
ConnectStatus.connectionLatch.countdown();
现在其他线程将收到锁存器的通知,原子值也将为真,线程开始发送数据。
在下面发送数据线程片段。
if(ConnectStatus.connected.get()){
// send data
}
现在这是我的问题,连接可能随时变坏和断开,所以那个时候,我把我的原子设置connected
为假的。我想知道的是,这个线程安全吗,我的其他线程总是会得到这个原子的、易失的变量的更新值吗?每当我的连接中断时,我需要我的另外两个线程停止发送数据。
if(ConnectStatus.connected.get()){
// send data
}
上面的代码片段总是能正常工作吗?