Java Concurrency in Practiceを読んだところ、次の質問が残っています: ConcurrentHashMap を使用する場合、本の第 1 部で説明されているデータの同時実行の問題について、まだ心配する必要がありますか? 以下は、私のプログラムの 1 つからの例です。
1. トレーダーの現在のポジション(「整数」が数学用語である共有整数)
この数値は、trader
オブジェクトが現在所有しているものを表し、その状態を定義します。何をすべきかを知るために、その位置を読み取る必要があります (新しい位置を開始するか、現在の位置を管理するかを調べます)。 Trader
メソッドは独自のスレッドで実行されます。
broker
オブジェクトは の位置の設定を担当しますtrader
。トレーダーの注文の 1 つが約定されるたびにポジションが設定されます。 Broker
メソッドは独自のスレッドで実行されます。
trader
との両方がbroker
同じパッケージに入っています。位置は package-private として実装されていますstatic ConcurrentHashMap
。キーはトレーダー オブジェクトの ID です。値は整数です。
パッケージの外部はアプリケーションです。public getter を使用してトレーダーのポジションを間接的に取得します。
位置はせいぜい数分に 1 回しか変化しないため、broker
頻繁にマップに触れることはありません。ただし、trader
アプリケーションは頻繁に読み取ります。さらに、複数のトレーダーが同時にマップを読んでいることがよくあります。
このように ConcurrentHashMap を使用すると、ロックやデータの可視性について作業する必要がなくなりますか? ConcurrentHashMap がすべてを処理しますか?
2. 市場 (ビッド、アスク、最終価格)
ポジションとほぼ同じ状況broker
ですが、非常に頻繁に価格が更新されます (繁忙期には 1 秒間に最大 10 回、通常は 1 秒間に数回)。およびアプリケーションはtrader
、依然として頻繁に読み取りを行います。マップ キーは現在、どの株または先物かを示すコードであり、値は市場価格を保持するオブジェクトです。
問題なく動作しているように見えますが、JCIP を読んだ後、正しく実装されていないとプログラムが壊れる可能性があることに気付きました。この本は ConcurrentHashMap について語っていますが、手動で対処する必要がなくなったパート I の問題については明示的に教えていません。この場合、何もする必要はないようです。synchronize
あれは正しいですか?