簡體   English   中英

在多線程環境中使用的哈希圖

[英]Hashmaps used in multithreaded environment

public class Test {
    private final Map<URI, Set<TestObject>> uriToTestObject = new HashMap<URI, Set<TestObject>>();
    private final Map<Channel, TestObject> connToTestObject = new HashMap<Channel, TestObject>();

    private static class TestObject {
        private URI server;
        private Channel channel;
        private final long startNano = System.nanoTime();
        private AtomicInteger count = new AtomicInteger(0);
    }
}

這是我計划用作連接管理器的類。 有兩個映射,一個將具有到連接詳細信息的服務器uri,即測試對象,另一個將具有通向TestObject通道,即連接條目詳細信息,當創建連接時,然后在兩個映射中按要求放置通道testobject和服務器uri,然后發出另一個請求首先在該服務器uri的地圖中檢查並獲取一個通道,類似地,當channel關閉時,從兩個地圖中刪除其對應的條目(即通道對象和測試對象),我應該使用並發哈希圖還是應該使用HashMap ,然后在在add remove方法中,我還將使用count AtomicInteger變量進行統計,該變量將遞增和遞減。

我的問題是在多線程環境中,即使我使用ConcurrentHashmap ,我是否也需要使方法同步,因為我將在一個方法中對兩個映射進行一些操作。

是的,您需要在multi-threaded環境中進行synchronization 如果您使用塊級同步而不是方法級同步,那就更好了。

程式碼片段:

Object lock = new Object();

void method1(){
   synchronized(lock){
   //do your operation on hash map
   }
}

void method2(){
   synchronized(lock){
   //do your operation on hash map
   }
}

關於ConcurrentHashMap

檢索操作(包括get)通常不會阻塞,因此可能與更新操作(包括put和remove)重疊。

因此,是的,即使您使用ConcurrentHashMap,您仍然可能需要進行syncronization

由於您需要同時操作兩個地圖,
使方法同步是更好的選擇。
如果方法同步,則​​HashMap就足夠了

暫無
暫無

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

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