为了账号安全,请及时绑定邮箱和手机立即绑定

如果我只以线程 id 为键调用 get、put、remove 并且从不迭代映射

如果我只以线程 id 为键调用 get、put、remove 并且从不迭代映射

慕田峪7331174 2021-09-03 21:30:43
我有一个静态 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.


查看完整回答
反对 回复 2021-09-03
  • 1 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号