Open3

Javaのsynchronizedの覚書

絹宮紀仁絹宮紀仁

やりたいこと

StreamのforEachでSetに要素の追加をしたい。

絹宮紀仁絹宮紀仁

JavaのStreamのforEachについて

アクションが共有状態にアクセスする場合、必要な同期を提供する責任はアクションにあります。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html#forEach-java.util.function.Consumer-

とあり、HashSetなどでは

この実装はsynchronizedされません。複数のスレッドが並行してハッシュ・セットにアクセスし、それらのスレッドの少なくとも1つがセットを変更する場合には、外部で同期をとる必要があります。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashSet.html

とあり、Collections.synchronizedSetを調べると

返されたセットの反復処理を行う場合、ユーザーは、次に示すように手動で同期をとる必要があります。
(コード略)
これを行わない場合、動作は保証されません。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collections.html#synchronizedSet-java.util.Set-
とある。

絹宮紀仁絹宮紀仁

書き込み(addなど)に関してはSet<T> s = Collections.synchronizedSet(new HashSet<T>())のようなsを通してアクセスした場合、自動で同期処理をしてくれるみたい?