gpt4 book ai didi

java - 下面的代码不是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-01 06:53:27 25 4
gpt4 key购买 nike

下面的代码有什么问题吗?

private Map<Integer, Integer> aMap = new ConcurrentHashMap<Integer, Integer>();    
Record rec = records.get(id);
if (rec == null) {
rec = new Record(id);
records.put(id, rec);
}
return rec;
  1. 上面的代码不是线程安全吗?在这种情况下,为什么我应该在这里使用 putIfAbsent
  2. 锁定仅适用于更新。在检索的情况下,允许完全并发。这句话是什么意思?

最佳答案

它不是线程安全的。

  1. 如果有另一个线程,那么在 records.getrecords.put 之间的时间里,另一个线程也可能已经放置了记录。

  2. 只读操作(即不修改结构的操作)可以由多个线程同时完成。例如,1000 个线程可以安全地读取 int 的值。但是,如果没有某种锁定操作,这 1000 个线程就无法更新 int 的值。

我知道这听起来像是一个非常不可能的事件,但请记住,百万分之一的事件在 1GHz 下每秒会发生 1000 次。

<小时/>

这是线程安全的:

private Map<Integer, Integer> aMap = new ConcurrentHashMap<Integer, Integer>();
// presumably aMap is a member and the code below is in a function
aMap.putIfAbsent(id, new Record(id))
Record rec = records.get(id);
return rec;

请注意,这可能会创建一个记录并且永远不会使用它。

关于java - 下面的代码不是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19073177/

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