本の市場をシミュレートするアプリを作成しています。
次のデータを持つ「BookA」という本を考えてみましょう。
45 47 50 51 55 70 73 75 79 81
**Bookstore1 Buy Qty** 2 3 5 11 1
**Bookstore2 Buy Qty** 1 3 5 1 10
**Bookstore1 Sell Qty** 1 11 7 8 20
**Bookstore2 Sell Qty** 2 5 2 5 10
**Data for BookA**
数値データはvolatile int[][] dataStorage = new int[5][10]
、row[0] に価格が含まれる場所として保存されます。
row[ 1] ..row[ 4 ] には、各書店で入手可能な数量が含まれます。たとえば、row[ 1 ]col[ 0 ] は、Bookstore1 が $45 で BookA を 2 部購入する意思があることを示します。同様に、row[ 4 ][ 5 ] は、Bookstore2 が $70 で 2 部を販売する意思があることを示しています。
私の市場には約 500 冊の本があり、それぞれのデータは ConcurrentHashMap に保存されています: ( ConcurrentMap<String, int[][]> map = new ConcurrentHashMap<String, int[][]>(500)
)
"本A" ----> int[][]
"ブックン" ----> int[][]
Bookstore1 と Bokstore2 からのデータは、2 つの別々のスレッドで到着します。現在、生データ オブジェクトをブロッキング キューに格納し、単一のスレッド ("ProcessingThread" ) を使用して上記の配列を作成および変更 (更新の場合) します。
最後に、別のスレッド (「CustomerThread」) で書籍の購入/販売の注文を送ってくれる顧客がいます。
典型的な注文は次のようになります: 「50 ドルで BookA を 3 つ購入」:
注文を受けて、私は次のことを行います。
1) マップにキー「BookA」が含まれているかどうかを確認します。
2) はいの場合、 ReadLock (ReentrantReadWriteLock.ReadLock)を保持しながら、BookA のデータ (int[][]) を複製します。
3) 次に、複製されたデータを繰り返し処理して、価格と合計数量を見つけます。
私の質問は次のとおりです。
a)プロデューサー(「ProcessingThread」)を同期する必要がないことを誰かが確認できますか。dataStorage (int[][]) は「ProcessingThread」スレッドによってのみ変更されるためです。さらに、dataStorage は揮発性であるため、データを書き込むと "happens-before" が確立されます (したがって、"CustomerThread" には最新の更新されたデータが表示されます)。
b)「CustomerThread」でスレッドセーフを確保するためのより良い(ロックを使用するよりもスケーラブルな)方法はありますか? AtomicIntegerArray を使用して回避できますか?
ありがとう