繁体   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