在多线程环境中使用的哈希映射

时间:2013-12-25 08:53:15

标签: java multithreading concurrenthashmap

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并获取一个通道,类似当通道关闭从两个地图中移除时,其对应的条目即通道对象和测试对象,我应该使用并发哈希映射还是应该使用{ {1}}然后同步添加删除方法,我也将使用count HashMap变量进行统计,它将递增和递减。

我的问题是在多线程环境中我是否需要使我的方法同步,即使我使用AtomicInteger,因为我会在一个方法中对两个地图进行一些操作。

2 个答案:

答案 0 :(得分:2)

是的,您需要synchronization环境中的multi-threaded。 如果你使用块级同步而不是方法级同步,那就更好了。

代码段:

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)一般不会阻塞,所以可能   与更新操作重叠(包括放置和删除)。

所以是的,即使你使用了ConcurrentHashMap,你仍然需要syncronization

答案 1 :(得分:-1)

由于您需要同时操作两张地图,
使方法同步是更好的选择 如果方法同步,HashMap就足够了