我有一个静态 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); }
1 回答

萧十郎
TA贡献1815条经验 获得超13个赞
您可以在阅读时修改地图。因此,至少出于这个原因,您应该考虑使用ConcurrentHashMap
或使用显式同步机制,因为HashMap
它并非旨在以这种方式使用:
请注意,此实现不是同步的。如果多个线程并发访问一个散列映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。
或使用ConcurrentHashMap
.
请注意,这ConcurrentHashMap
可能不适合,因为您希望根据时间线在特定时刻获取与键关联的值。与 一样ConcurrentHashMap
,检索操作不是阻塞的,它们反映了最后一个“已知信息”,不一定是最后一个按时间顺序排列的信息:
检索操作(包括获取)一般不会阻塞,因此可能与更新操作(包括放置和删除)重叠。检索反映了最近完成的更新操作的结果。
一般来说,I
即时获得确切信息实际上取决于您的要求。你不解释你的,但无论如何,这并不重要,因为根据你的实际代码,该方法由不操作相同键/值的线程并发访问。所以,这种ConcurrentHashMap
特殊性不是问题。
所以对于ConcurrentHashMap
.
添加回答
举报
0/150
提交
取消