この呼び出しがスレッドセーフであるかどうかを知りたいです。私が持っている場合、例えば、セットS:guava ImmutableSet.copyOf()はスレッドセーフですか?
Set<String> s = new HashSet<>();
と二つのスレッドA及びBは、変更セットスレッド:
for (int i = 0; i < 1234; i++) {
// add, remove from s
}
スレッドBがSからImmutableSets作成中:
for (int i = 0; i < 5678; i++) {
Set<String> newS = ImmutableSet.copyOf(s);
}
を
ImmutableSet.copyOf()
が呼び出されるたびに、有効な状態sの不変集合が得られると仮定するのは安全でしょうか?発生する可能性のある種類の例外(ConcurrentModificationException
など)がありますか?
スレッドセーフであれば、セットをロックすることなくどのように達成されましたか?
私はグアバを使用していますが、私は質問があります(https://stackoverflow.com/questions/46900147/send-record-and-wait-for-its-acknowledgement-to-receive)これらの操作が正しく機能しているかどうかはわかりません。 – john
HashSetは、誰も同時に変更しなくてもスレッドセーフではありません。 HashSetへのアクセスは常に同期する必要があります。 – 30thh