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

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

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

2 回答

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

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

        }

    }

}


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

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊

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



查看完整回答
反對 回復(fù) 2023-05-10
  • 2 回答
  • 0 關(guān)注
  • 170 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

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