同時アクセスを探すたびに、私はさまざまな答えを受け取ります.JCIPの本はすでに注文していて、進行中ですが、この同時実行の基本を釘付けにしたいのですが、これが私のシナリオです.
私は3つのスレッドを持っています。1 つのスレッドは接続を確立し、シングルトン接続オブジェクト インスタンスを作成します。他の 2 つのスレッドは絶え間なくデータを送信します。
CountDownLatch
これで、接続が確立されると、接続スレッドによってゼロまでカウントダウンされるa を他のスレッドが待機します。
変数が同期され、すべてのスレッドに表示さConnectStatus
れることを期待して、クラスで宣言したものを次に示します。connected
public class ConnectStatus {
public static final CountDownLatch connectionLatch = new CountDownLatch(1);
private static volatile AtomicBoolean connected;
}
接続ステータスを維持するために、揮発性でアトミックなこのconnected
変数を使用しています。そのため、他のスレッドは、データを送信する前に接続が有効かどうかを「常に」知ることができます。
接続を確立したら、このブール値を true にし、ラッチをゼロにします。
ConnectStatus.connected.set(true);
ConnectStatus.connectionLatch.countdown();
これで、他のスレッドはラッチによって通知され、原子値も true になり、スレッドはデータの送信を開始します。
以下のデータ スレッド スニペットを送信します。
if(ConnectStatus.connected.get()){
// send data
}
ここに私の問題があります。接続はいつでも悪くなり、切断される可能性があるため、その時点で、アトミックconnected
を false にしています。私が知りたいのは、このスレッドは安全ですか、他のスレッドは常にこのアトミックで揮発性の変数の更新された値を取得しますか? 接続が切断されるたびにデータの送信を停止するには、他の 2 つのスレッドが必要です。
if(ConnectStatus.connected.get()){
// send data
}
上記のスニペットは常に正しく機能しますか?