簡體   English   中英

如何在處理多個線程時深層復制hashmap

[英]How to deep copy a hashmap when working with multiple threads

在我的應用程序中,我有兩個線程。 線程1正在將數據傳輸到線程2.傳輸數據后,線程1中的數據在線程2中被清除。線程1以其快樂的方式將更多數據放入HashMap中,因為它稍后將被傳輸到線程2。 與此同時,線程2完成了對數據所需的操作。 我下面的代碼是線程2中的部分,其中線程之間的數據傳輸發生。 整個應用程序工作正常,但我的問題是,有沒有更好的方法來為線程2創建線程1數據的這個副本而不使用關鍵字new來創建一個全新的對象?

我想這樣做可能會導致更多的垃圾收集? 我不應該擔心這個嗎?

synchronized(this){
    // Make a copy of the data map then clear it.
    cachedData = new HashMap<String,ArrayList<Float>>(data);
    data.clear();
}

為什么不呢:

    synchronized(this){
        cachedData = data;
        data = new HashMap<String,ArrayList<Float>>();
    }

這與您擁有的類似,但不涉及復制數據。

我不會擔心new太多(除非你能通過剖析證明這是一個問題)。

因此,如果您從多個線程訪問此data HashMap ,則必須在每次訪問時都有一個synchronized塊。 僅僅因為你在這里抓取一個緩存副本並不意味着其他線程可以在沒有同步的情況下使用data

如果你想同時使用HashMap 不必圍繞每個用法進行同步,那么你應該使用ConcurrentHashMap

整個應用程序工作正常,但我的問題是,有沒有更好的方法來為線程2創建線程1數據的這個副本而不使用關鍵字new來創建一個全新的對象?

考慮到我上面提到的注意事項,如果你想拍攝一個HashMap的快照,這樣你就可以使用特定線程中的內容,那么你提到的模式很好並經常使用。 當您需要遍歷Collection並在循環內部修改它但不執行iterator.remove()時,也會使用此模式。

如果您只需要鍵或值,請確保獲取data.keySet()data.values()的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM