根据以下JLS规则 - 线程中的每个动作都发生在该线程中的每个动作之前,该动作将在程序的后续命令中出现。
在下面的例子中,clear()总是在放入多线程环境之前执行
private ConcurrentMap<Feature, Boolean> featureMap = new ConcurrentHashMap<>();
public void loadAllConfiguration() {
featureMap.clear();
featureMap.put()
}
答案 0 :(得分:0)
我对这个问题不是很清楚,但我认为:
线程中的每个操作都发生在该线程中的每个操作之前 在程序的订单中稍后出现。
表示在单个线程的上下文中(因为clear
和put
阻塞同步调用),运行时保证它们将按照调用它们的顺序执行。
基于我对java的有限理解,这不应该扩展到多线程环境。假设您在两个线程之间共享一个并发映射,并且每个线程都会针对共享loadAllConfiguration
调用featureMap
。
线程可以同时执行,因此操作是交错的!!!!
这可能导致执行顺序为:
**THREAD 1** **THREAD 2**
map.clear()
map.put()
map.clear()
map.put()
或甚至两个清除被同时调用,然后两个放置同时应用。
我还没有使用过java,所以我不确定ConcurrentHashMap
提供了什么,但我假设它只能保护你免受竞争条件的影响(一个线程写入而另一个读取)通过使用某种同步,但它仍然可能让你暴露于逻辑错误(即清除/放置)以确定的方式交错)
答案 1 :(得分:0)
在下面的例子中,clear()总是在放入多线程环境之前执行
是的,在多线程应用程序中,每个线程clear()
都在put()
之前。但是,当您查看多个线程的交互时,就共享ConcurrentHashMap
而言,这已不再适用。
例如,由于竞争条件,您可能会看到以下事件序列:
即使每个帖子都清楚然后放了,但如果这是你问题的要点,则无法保证ConcurrentHashMap
中只有1个项目。