gpt4 book ai didi

java - 使用线程安全集合的多线程

转载 作者:行者123 更新时间:2023-12-02 07:42:18 26 4
gpt4 key购买 nike

我不明白如何使下面的代码片段成为线程安全的。

class MapUser {
Map<String,Integer> map = new ConcurrentHashMap<String,Integer>

public void addToMap(String str, Integer val){
if(checkMagicString(str)){
map.put(str,val);
}
}

private boolean checkMagicString(String str){
//some logic to check Magic
//this logic involved operation on the String parameter str i.e. subString,toCharArray etc
}
}

请注意,addToMap 方法是由多个线程同时调用的。我想确保维持线程安全。通过使用 ConcurrentHashMap,我可以确保线程安全地将值添加到其中。

但是我不明白方法 checkMagicString(String str) 如何保持线程安全?是使其同步的唯一方法吗?或者应该使调用者方法 addToMap 同步?请注意,我没有在 checkMagicString 方法中访问 map 。

最佳答案

即使你确实使 checkMagicString 原子化,它也不会使序列

if(checkMagicString(str)){
map.put(str,val);
}

原子性,因为线程可以在 if 检查和 map.put 调用之间中断,因此最终可能会导致两个线程插入相同的字符串。为了安全起见,您需要锁定整个序列。

编辑:如果上述行为是可接受的(即两个线程插入相同的键并覆盖该值)并且 checkMagicString 不在共享状态下运行,那么您的代码是就这样就好了。

关于java - 使用线程安全集合的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11418193/

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