我正在编写一个应用程序来模拟图书市场。
考虑一本名为“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] 表示以 45 美元的价格,Bookstore1 愿意购买 2 份 BookA。类似地,row[4][5] 表示 Bookstore2 愿意以 70 美元出售 2 本。
我的市场上有大约 500 本书,每本书的数据都存储在 ConcurrentHashMap 中:(ConcurrentMap<String, int[][]> map = new ConcurrentHashMap<String, int[][]>(500)
)
“BookA”----> int[][]
“Bookn”----> int[][]
Bookstore1 和 Bokstore2 中的数据通过两个单独的线程到达。目前,我将原始数据对象存储在阻塞队列中,并使用单个线程(“ProcessingThread”)来创建和修改(在更新的情况下)上述数组。
最后,我的客户在一个单独的线程(“CustomerThread”)中向我发送购买/出售书籍的订单。
一个典型的订单如下所示:“以 50 美元购买 3 份 BookA”:
收到订单后,我执行以下操作:
1) 检查地图是否包含键“BookA”。
2) 如果是,那么我在持有ReadLock (ReentrantReadWriteLock.ReadLock) 的同时克隆 BookA 的数据 (int[][])。
3)然后我遍历克隆数据以找到价格和总数量。
我的问题是:
a)有人可以确认我不需要同步生产者(“ProcessingThread”)。由于 dataStorage (int[][]) 仅由“ProcessingThread”线程更改。此外,由于 dataStorage 是易失的,因此当我写入它时将建立一个“之前发生”(因此,“CustomerThread”将看到最新更新的数据)。
b) 是否有更好的(比使用锁更具可扩展性)方法来确保“CustomerThread”中的线程安全?我可以通过使用 AtomicIntegerArray 逃脱吗?
谢谢