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

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

多線程:持續(xù)寫入共享數(shù)據(jù)結(jié)構(gòu)并定期清除

多線程:持續(xù)寫入共享數(shù)據(jù)結(jié)構(gòu)并定期清除

藍(lán)山帝景 2021-12-01 17:07:40
我有一個問題,我有多個線程不斷寫入,例如并發(fā) HashMap。現(xiàn)在,我想定期處理(通過 TimerJob)該哈希圖中的所有內(nèi)容。其他線程仍然可以繼續(xù)寫入(這個新數(shù)據(jù)將在 Timejob 下次啟動時處理)。我想知道實(shí)現(xiàn)這一目標(biāo)的最佳方法是什么。我正在閱讀,這個問題似乎很像Triple Buffer。盡管如此,我并不是非常積極。有什么想法嗎?編輯:我想以這種方式處理后從地圖中刪除數(shù)據(jù),我最終不會重新處理該數(shù)據(jù)編輯:我不需要將數(shù)據(jù)寫入 HashMap/Set。我只需要將它放在一個集合中,我可以在其他線程仍在寫入時定期處理該集合。
查看完整描述

2 回答

?
HUWWW

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個贊

我不確定您是否需要地圖中的所有數(shù)據(jù),或者地圖中不再需要的計(jì)時器作業(yè)處理的數(shù)據(jù)。


如果您只需要計(jì)時器作業(yè)的快照之類的東西,您可以像這樣用新地圖切換/替換地圖。


private volatile ConcurentHashMap map ;


public void processByTimerJob(){


   ConcurentHashMap oldMap = this.map;

   this.map = new ConcurrentHashMap; // everyting new will be stored in new map    

   oldMap.forEach(.....   //process old map via iteration or whatever you want


}


查看完整回答
反對 回復(fù) 2021-12-01
?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個贊

我會使用double buffering和讀/寫鎖。


雙緩沖通過允許處理換出的映射來減少阻塞。


使用讀/寫鎖讓我可以確定在我們交換后沒有人仍在寫入地圖。


class DoubleBufferedMap<K, V> extends AbstractMap<K, V> implements Map<K, V> {

    // Used whenever I want to create a new map.

    private final Supplier<Map<K, V>> mapSupplier;

    // The underlying map.

    private volatile Map<K, V> map;

    // My lock - for ensuring no-one is writing.

    ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    final Lock readLock = readWriteLock.readLock();

    final Lock writeLock = readWriteLock.writeLock();


    public DoubleBufferedMap(Supplier<Map<K, V>> mapSupplier) {

        this.mapSupplier = mapSupplier;

        this.map = mapSupplier.get();

    }


    /**

     * Swaps out the current map with a new one.

     * 

     * @return the old map ready for processing, guaranteed to have no pending writes.

     */

    public Map<K,V> swap() {

        // Grab the existing map.

        Map<K,V> oldMap = map;

        // Replace it.

        map = mapSupplier.get();

        // Take a write lock to wait for all `put`s to complete.

        try {

            writeLock.lock();

        } finally {

            writeLock.unlock();

        }

        return oldMap;

    }


    // Put methods must take a read lock (yeah I know it's weird)


    @Nullable

    @Override

    public V put(K key, V value) {

        try{

            // Take a read-lock so they know when I'm finished.

            readLock.lock();

            return map.put(key, value);

        } finally {

            readLock.unlock();

        }

    }


    @Override

    public void putAll(@NotNull Map<? extends K, ? extends V> m) {

        try{

            // Take a read-lock so they know when I'm finished.

            readLock.lock();

            map.putAll(m);

        } finally {

            readLock.unlock();

        }

    }


    @Nullable

    @Override

    public V putIfAbsent(K key, V value) {

        try{

            // Take a read-lock so they know when I'm finished.

            readLock.lock();

            return map.putIfAbsent(key, value);

        } finally {

            readLock.unlock();

        }

    }



    // All other methods are simply delegated - but you may wish to disallow some of them (like `entrySet` which would expose the map to modification without locks).


    @Override

    public Set<Entry<K, V>> entrySet() {

        return map.entrySet();

    }


    @Override

    public boolean equals(Object o) {

        return map.equals(o);

    }


    @Override

    public int hashCode() {

        return map.hashCode();

    }


    // ... The rest of the delegators (left to the student)



查看完整回答
反對 回復(fù) 2021-12-01
  • 2 回答
  • 0 關(guān)注
  • 187 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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