私の状況では、2 つのスレッドがあります。1 番目のスレッドは、すべてが作成されるまで 2 番目のスレッドがアクセスできない多数のオブジェクトを生成します。その後、2 番目のスレッドがこれらのオブジェクトのフィールドを読み取りますが、1 番目のスレッドと同時に読み取ります。この時点で、オブジェクトのフィールドの値を変更するスレッドはありません。オブジェクトは同期されません。それらを同期する必要がありますか?
2 に答える
私がお勧めするのは、を使用することAtomicReference<Collection<SomeObject>>です。最初のスレッドは、オブジェクトのコレクションを生成し、reference.put(collection). 2 番目のスレッドは、オブジェクト ( reference.get()) のみが設定された後にそれらを認識しAtomicReferenceます。のjavadocAtomicReferenceは次のとおりです。オブジェクトを配列または などの任意のタイプのコレクションとして設定することもできますList。
コレクション (または配列) を設定した後は、AtomicReferenceコレクションに変更を加えることはできません。アイテムを追加したり、クリアしたりすることはできません。オブジェクトのコレクションへの真の同時アクセスが必要な場合はConcurrentHashMap、友達を調べてください。
それらを同期する必要がありますか?
コレクションに入れられた後にオブジェクトがまったく変更されない場合は、それらを同期させる必要はありません。
複数のスレッドから同時にデータを読み取っても問題はありません。そのデータを変更しようとすると問題が発生します。オブジェクトが完全に初期化され、値が 2 番目のスレッドが実際の値を受け取るようなものである限り (キャッシュなどの問題がない)、複数のスレッドから同時にデータを読み取っても問題はありません。