Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我只调用get、put、remove,线程id是键,并且从不迭代映射,那么我需要ConcurrentHashMap吗?_Java_Concurrency_Hashmap - Fatal编程技术网

Java 如果我只调用get、put、remove,线程id是键,并且从不迭代映射,那么我需要ConcurrentHashMap吗?

Java 如果我只调用get、put、remove,线程id是键,并且从不迭代映射,那么我需要ConcurrentHashMap吗?,java,concurrency,hashmap,Java,Concurrency,Hashmap,但这次情况略有不同 我有一个静态hashMap,与多个线程共享。我不迭代地图,也不关心地图的大小。我只在地图中使用get,put,remove。每个线程可以调用someClass.track(true)或someClass.track(false)。我想跟踪每个线程何时进入方法(递增#),何时退出方法(递减#) 仅使用HashMap就足够了吗?或者我必须使用ConcurrentHashMap来保证从track方法中获得正确的值 方法如下所示 private static Map<Long,

但这次情况略有不同

我有一个静态hashMap,与多个线程共享。我不迭代地图,也不关心地图的大小。我只在地图中使用
get
put
remove
。每个线程可以调用
someClass.track(true)
someClass.track(false)
。我想跟踪每个线程何时进入方法(递增#),何时退出方法(递减#)

仅使用HashMap就足够了吗?或者我必须使用ConcurrentHashMap来保证从
track
方法中获得正确的值

方法如下所示

private static Map<Long, Integer> TRACKER = new HashMap<Long,Integer>();
public static Integer track(boolean b) {
    long tid = Thread.currentThread().getId();
    if (b) {
        if (TRACKER.containsKey(tid)) {
            TRACKER.put(tid, TRACKER.get(tid) + 1);
        } else {
            TRACKER.put(tid, 1);
        }
    } else {
        Integer n = TRACKER.get(tid);
        if (n != null) {
            n = n -1;
            if (n == 0) {
                TRACKER.remove(tid);
            } else {
                TRACKER.put(tid, n);
            }
        }
    }
    return TRACKER.get(tid);
  }
private static Map TRACKER=new HashMap();
公共静态整数轨道(布尔b){
long tid=Thread.currentThread().getId();
如果(b){
if(集装箱跟踪系统(tid)){
TRACKER.put(tid,TRACKER.get(tid)+1);
}否则{
贸易逆差(tid,1),;
}
}否则{
整数n=TRACKER.get(tid);
如果(n!=null){
n=n-1;
如果(n==0){
移除跟踪器(tid);
}否则{
跟踪器.put(tid,n);
}
}
}
返回跟踪程序。获取(tid);
}

您可以在阅读地图时修改地图。因此,至少出于这个原因,您应该考虑使用<代码> CONCURNESHASMAP 或使用显式同步机制,而不是被设计为这样使用:

请注意,此实现是不同步的。如果有多个线程 同时访问哈希映射,并至少访问其中一个线程 如果从结构上修改贴图,则必须从外部对其进行同步

或者使用
ConcurrentHashMap

请注意,
ConcurrentHashMap
可能不适合,因为您希望根据时间线在特定时刻获取与键关联的值。与
ConcurrentHashMap
一样,检索操作不是阻塞的,它们反映了最后的“已知信息”,即:

检索操作(包括get)通常不会阻塞,因此 与更新操作重叠(包括放置和删除)。检索 反映最近完成的更新操作的结果 坚持他们的开始

一般来说,在
I
瞬间获得准确的信息实际上取决于您的需求。您不需要解释您的方法,但不管怎样,这并不重要,因为根据您的实际代码,该方法是由不操作相同键/值的线程并发访问的。因此,这个
ConcurrentHashMap
特殊性不是问题。

因此,它似乎是
ConcurrentHashMap
的一个非常好的用例

您说具有相同tid的线程B可以输入相同的语句。如果像他说的那样,tid实际上是一个线程id,这怎么会发生呢?你需要有多个具有相同id的线程,对吗?@Eric Petroleje我想到了同样的事情。我重写了我的答案。当OP在地图上执行并发读/写操作时,仍然需要同步。下面是@Anthony C,在您提问时,您应该关注需求。根据老问题,你试图猜测可能永远不会发生的非常具体的问题。但这个问题已经清楚得多了。这是一个非常简单的问题,它跟踪每个线程中输入特定方法(可能是递归)的调用数。它在方法的第一行调用
track(true)
,在方法的最后一行调用
track(false)
。我认为前一个问题的答案非常充分地告诉了您这是一个危险的错误,并参考了api文档,其中说明不要这样做。还有什么需要澄清的?@NathanHughes,只是想知道ConcurrentHashMap是否足以修复它,或者需要更多的东西。