多线程环境中的ConcurrentHashMap方法执行顺序

时间:2018-05-18 11:06:41

标签: java multithreading concurrency concurrenthashmap

根据以下JLS规则 - 线程中的每个动作都发生在该线程中的每个动作之前,该动作将在程序的后续命令中出现。

在下面的例子中,clear()总是在放入多线程环境之前执行

private ConcurrentMap<Feature, Boolean> featureMap = new ConcurrentHashMap<>();

public void loadAllConfiguration() {
    featureMap.clear();
    featureMap.put()
}

2 个答案:

答案 0 :(得分:0)

我对这个问题不是很清楚,但我认为:

  

线程中的每个操作都发生在该线程中的每个操作之前   在程序的订单中稍后出现。

表示在单个线程的上下文中(因为clearput阻塞同步调用),运行时保证它们将按照调用它们的顺序执行。

基于我对java的有限理解,这不应该扩展到多线程环境。假设您在两个线程之间共享一个并发映射,并且每个线程都会针对共享loadAllConfiguration调用featureMap

线程可以同时执行,因此操作是交错的!!!!

这可能导致执行顺序为:

**THREAD 1**                          **THREAD 2**
map.clear()
map.put()
                                     map.clear()
                                     map.put()

或甚至两个清除被同时调用,然后两个放置同时应用。

我还没有使用过java,所以我不确定ConcurrentHashMap提供了什么,但我假设它只能保护你免受竞争条件的影响(一个线程写入而另一个读取)通过使用某种同步,但它仍然可能让你暴露于逻辑错误(即清除/放置)以确定的方式交错)

答案 1 :(得分:0)

  

在下面的例子中,clear()总是在放入多线程环境之前执行

是的,在多线程应用程序中,每个线程clear()都在put()之前。但是,当您查看多个线程的交互时,就共享ConcurrentHashMap而言,这已不再适用。

例如,由于竞争条件,您可能会看到以下事件序列:

  1. 线程1调用clear()。
  2. 线程2调用clear()。
  3. 线程3调用clear()。
  4. 线程2调用put()。
  5. 线程1调用put()。
  6. 线程3调用put()。
  7. 即使每个帖子都清楚然后放了,但如果这是你问题的要点,则无法保证ConcurrentHashMap中只有1个项目。