たとえば、同期のない可変クラス Foo (または ArrayList など) があります。このようなオブジェクトの構築には時間がかかるため、別のスレッドで実行したいと考えています。
計算の結果をどこかに保存し、後で別のスレッドからアクセスすると、同期または揮発性が必要になるため、スレッドセーフではありませんよね? (ここは正直よくわかりません)
そのため、Foo を同期せずに、そのようなオブジェクトをあるスレッドから別のスレッドに渡す方法を探しています。
たとえば、同期のない可変クラス Foo (または ArrayList など) があります。このようなオブジェクトの構築には時間がかかるため、別のスレッドで実行したいと考えています。
計算の結果をどこかに保存し、後で別のスレッドからアクセスすると、同期または揮発性が必要になるため、スレッドセーフではありませんよね? (ここは正直よくわかりません)
そのため、Foo を同期せずに、そのようなオブジェクトをあるスレッドから別のスレッドに渡す方法を探しています。
これは、Future を作成し、後で同じ実行スレッドで結果を取得することで解決できるものではないのではないかと最初に考えます。これにより、すべてが非常に簡単になります。
あなたの要件はProducer Consumer Patternに一致します。Java の並行パッケージ a は、スレッドセーフなコレクション (BlockingQueue
など) を提供します。Producer がオブジェクトを作成し、 に配置しBlockingQueue
ます。次に、コンシューマがオブジェクトを取得します。これが実装例です。
そのためにAtomicReferenceを使用することもできます。この回答を見てください: Java で AtomicReference を使用する場合は?
こちらもご覧ください: Java Concurrency: CAS vs Locking
とは言っても、並行プログラミングを正すのは困難です。したがって、できるだけシンプルに保ち、Java が提供する標準的なsynchronize
方法を共通のロックで使用することをお勧めします。それがボトルネックであることに気付いた場合は、後でいつでも別のより洗練された方法を使用できます。