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

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

  }


慕田峪7331174
浏览 126回答 1
1回答

萧十郎

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

相关分类

Java