对于以下情况,正确的结构是什么?
假设我们有一个股票系统(域并不重要,只是一个例子),而且每个操作都很慢(例如,与外部系统联系)。
我想的是,我可以以并行的方式处理不影响相同WH的请求。例如:
我正在考虑一个线程安全映射,其中包含了我目前正在处理的仓库的所有ids。
还有什么更好的吗?
发布于 2019-08-02 15:40:58
我建议为每个lock对象引入一个Warehouse变量以及一个唯一的整数。您可以使用AtomicInteger来确保每个创建的仓库都有其唯一的编号。
public class Warehouse {
private static final AtomicInteger numberProvider = new AtomicInteger(0);
private final int number;
private final Lock lock = new ReentrantLock();
// ...
public Warehouse(...) {
this.number = numberProvider.incrementAndGet();
...
}
// ... (getter for number and lock and other methods)
}这样,您可以始终以“正确”顺序锁定两个仓库(例如,首先锁定较低的数字,然后锁定较高的;向后方向解锁)。这将保证您不会遇到死锁。
public void moveStock(Warehouse from, Warehouse to, int nof) {
List<Lock> locks = Stream.of(from, to)
.sorted(Comparator.comparingInt(Warehouse::getNumber))
.map(Warehouse::getLock)
.collect(Collectors.toList());
for(int i=0;i<locks.size();++i) {
locks.get(i).lock();
}
try {
from.substractStock(nof);
to.addStock(nof);
} finally {
for(int i=locks.size()-1;i>=0;i--) {
locks.get(i).unlock();
}
}
}发布于 2019-08-02 16:21:50
集合将是您正在寻找的数据结构。
https://stackoverflow.com/questions/57327126
复制相似问题