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を通してアクセスした場合、自動で同期処理をしてくれるみたい?