Java 如果我只调用get、put、remove,线程id是键,并且从不迭代映射,那么我需要ConcurrentHashMap吗?
但这次情况略有不同 我有一个静态hashMap,与多个线程共享。我不迭代地图,也不关心地图的大小。我只在地图中使用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,
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是否足以修复它,或者需要更多的东西。