2017-06-09 7 views
2

この呼び出しがスレッドセーフであるかどうかを知りたいです。私が持っている場合、例えば、セット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など)がありますか?

スレッドセーフであれば、セットをロックすることなくどのように達成されましたか?

答えて

6

関連の質問はcopyOfが安全であるかどうかではない - それはからをコピーするのコレクションが安全であるかどうかだし、特に、それはそのiterator()メソッドを介して作成されますイテレータは、スレッドセーフであるかどうか。 HashMapの場合、その答えは「いいえ」です。

4

HashSetはスレッドセーフではありません。 ImmutableSet.copyOfは、HashSetを反復処理する必要があります。別のスレッドがそれを同時に変更している場合は安全ではありません。さらに、HashSetを変更している2つのスレッドがすでに危険です。

+0

私はグアバを使用していますが、私は質問があります(https://stackoverflow.com/questions/46900147/send-record-and-wait-for-its-acknowledgement-to-receive)これらの操作が正しく機能しているかどうかはわかりません。 – john

+0

HashSetは、誰も同時に変更しなくてもスレッドセーフではありません。 HashSetへのアクセスは常に同期する必要があります。 – 30thh

関連する問題