私はライブソケットを取得するために同時に複数のスレッドによって呼び出される以下のメソッドを持っています。それはパラメータとしてLinkedBlockingQueue
をとり、それから私は反復し、使用可能なliveSocketがあるかどうかを確認し、使用可能な場合は削除してソケットを返します。LinkedBlockingQueueからelmentsを削除する際に、以下のコードスレッドが安全ですか?
private Optional<Holder> getSocket(final LinkedBlockingQueue<Holder> endPoints) {
Optional<Holder> liveSocket = Optional.absent();
if (!endPoints.isEmpty()) {
for (Holder state : endPoints) {
// check if socket is live? if yes then remove and return that.
if (state.isLive()) {
liveSocket = Optional.of(state);
endPoints.remove(state);
return liveSocket;
}
}
}
return Optional.absent();
}
上記のコードがスレッドセーフであるかどうかを確認したいのですか?ここではHolder
は不変クラスです。
キュー操作はスレッドセーフですが、含まれているオブジェクトの状態ではありません。 'liveSocket'が状態をチェックするときとキューからそれを削除するときの間で、別のスレッドによって' liveSocket'が非ライブ化されるとどうなりますか? –