@ zhong.j.yuの回答を改善すると、書き込みが発生したときに実行しようとするのではなく、書き込みをキューに入れることをお勧めします。ただし、更新が非常に高速に行われるため、継続的に更新が行われるとリーダーが窒息する場合、この問題に取り組む必要があります。次の読み取りで対処します)。
独自の同期キューを作成する必要があります。これはリンクされたリストに基づいており、次の 2 つのメソッドのみが含まれます。
public synchronised enqeue(Write write);
このメソッドは、アトミックに書き込みをキューに入れます。書き込みが実際にキューに入るよりも速くなると、デッドロックが発生する可能性がありますが、それを達成するには毎秒数十万回の書き込みが必要になると思います。
public synchronised Element cut();
これにより、キューがアトミックに空になり、その先頭 (または末尾) が Element オブジェクトとして返されます。これには、他の要素 (Element.next など、通常のリンク リストのもの) のチェーンが含まれます。これらはすべて、最後の読み取り以降の一連の書き込みを表します。その後、キューは空になり、新しい書き込みを受け入れる準備が整います。その後、リーダーは要素チェーンをトレースし (それまではスタンドアロンであり、後続の書き込みには影響されません)、書き込みを実行し、最後に読み取りを実行できます。リーダーが読み取りを処理している間、新しい書き込みがキューに入れられますが、それらは次の読み取りの問題になります。
C++ ではありますが、サウンド データ バッファーを表すために、これを 1 回書きました。書き込み (ドライバーはより多くのデータを送信します) は、読み取り (データに対する数学的なもの) よりも多くありましたが、書き込みはできるだけ早く終了する必要がありました。(データはリアルタイムで取得されたので、次のバッチがドライバーで準備される前に保存する必要がありました。)