2 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
我建議您lock為每個(gè)Warehouse對象引入一個(gè)變量以及一個(gè)唯一的整數(shù)。您可以使用 anAtomicInteger來確保每個(gè)創(chuàng)建的倉庫都有其唯一編號
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)
}
這樣您就可以始終以“正確”的順序鎖定兩個(gè)倉庫(例如,先鎖定較低的數(shù)字,然后鎖定較高的數(shù)字;向后解鎖)。這將保證您不會(huì)遇到死鎖。
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();
}
}
}
添加回答
舉報(bào)