gpt4 book ai didi

java - 关于java线程+同步的具体问题

转载 作者:行者123 更新时间:2023-12-01 07:40:05 26 4
gpt4 key购买 nike

我知道这个问题听起来很疯狂,但请考虑以下 java 片段:

第一部分:

 class Consumer implements Runnable{
private boolean shouldTerminate = false
public void run() {
while( !shouldTerminate ){
//consume and perform some operation.
}
}

public void terminate(){
this.shouldTerminate = true;
}
}

所以,第一个问题是,我是否需要同步 shouldTerminate boolean 值?如果是这样为什么?我不介意错过将标志设置为 true 一两个周期(周期 = 1 循环执行)。其次, boolean 变量是否可以处于不一致的状态?(除 true 或 false 之外的任何状态)

问题的第二部分:

class Cache<K,V> {

private Map<K, V> cache = new HashMap<K, V>();

public V getValue(K key) {
if ( !cache.containsKey(key) ) {
synchronized(this.cache){
V value = loadValue(key)
cache.put(key, value);
}
}
return cache.get(key);
}
}

是否应该同步访问整个 map ?是否有可能两个线程尝试运行此方法,其中一个“写入器线程”在将值存储到映射的过程中途,同时一个“读取器线程”调用“包含”方法。这会导致JVM崩溃吗? (我不介意覆盖 map 中的值 - 如果两个编写器线程尝试同时加载)

最佳答案

两个代码示例都破坏了并发性。

第一个至少需要标记为 volatile 的字段,否则其他线程可能永远不会看到变量被更改(它可能将其值存储在CPU缓存或寄存器中,并且不检查变量是否被更改)内存中的值已更改)。

第二个更糟糕,因为 HashMap 的内部不是线程安全的,它不仅仅是一个值,而是一个复杂的数据结构 - 从多个线程使用它会产生完全不可预测的结果。一般规则是读取和写入共享状态必须同步。您还可以使用 ConcurrentHashMap 以获得更好的性能。

关于java - 关于java线程+同步的具体问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6105782/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com