您面临的问题似乎是TOCTTOU类问题。(是的,这种错误经常发生,它有自己的名字。
将条目插入地图时, 至少 需要发生以下两件事:
- 检查密钥是否已经存在。
- 如果检查返回true,则更新现有条目,否则,添加新条目。
如果这两个原子不是原子发生的(就像在正确同步的地图实现中那样),那么几个线程可以得出结论,在步骤1中该键尚不存在,但是到它们到达步骤2时,不再是真的。因此,多个线程将愉快地插入具有相同键的条目。
请注意,这不是唯一可能发生的问题,并且取决于实现方式和您的可见性,您可能会遇到各种不同的意外故障。



