第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 并發(fā) - 避免同時修改具有相同 ID 的對象的數(shù)據(jù)結(jié)構

Java 并發(fā) - 避免同時修改具有相同 ID 的對象的數(shù)據(jù)結(jié)構

12345678_0001 2023-05-10 15:39:22
對于以下情況,正確的結(jié)構是什么:假設我們有一個庫存系統(tǒng)(域并不重要,這只是一個例子)并且每個操作都很慢(例如聯(lián)系外部系統(tǒng))。它處理 ~ 50 個倉庫 (WH)。我可以將庫存從一個倉庫轉(zhuǎn)移到另一個倉庫。我要保證最終庫存是正確的我在想的是,我可以并行處理不影響同一個 WH 的請求。例如:請求將 20 件物品從倉庫 1 移動到倉庫 3將 15 個項目從 2 移動到 5 的請求移動(可以與上一個并行處理)請求將 5 個項目從 3 移動到 6(它應該等待第一個請求完成后再繼續(xù))。我在考慮一個線程安全的映射,其中包含我當前正在處理的倉庫的所有 ID。有更好的東西嗎?
查看完整描述

2 回答

?
阿波羅的戰(zhàn)車

TA貢獻1862條經(jīng)驗 獲得超6個贊

我建議您lock為每個Warehouse對象引入一個變量以及一個唯一的整數(shù)。您可以使用 anAtomicInteger來確保每個創(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)

}

這樣您就可以始終以“正確”的順序鎖定兩個倉庫(例如,先鎖定較低的數(shù)字,然后鎖定較高的數(shù)字;向后解鎖)。這將保證您不會遇到死鎖。


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();

        }

    }

}


查看完整回答
反對 回復 2023-05-10
?
溫溫醬

TA貢獻1752條經(jīng)驗 獲得超4個贊

集合將是您正在尋找的數(shù)據(jù)結(jié)構。



查看完整回答
反對 回復 2023-05-10
  • 2 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號