【发布时间】:2017-07-11 08:04:06
【问题描述】:
如果我们不使用Collections.synchronizedMap(),假设我有一个多线程环境。
我知道竞态条件、调整大小等问题。
我的问题是,是否有一个案例 2 线程 Ta 和 Tb 具有相同的对象并试图放入地图中。
是否可以有 2 个条目,如果不是如何防止的话。同时运行的 2 个不同线程的 2 个 put 调用之间是否存在时间差异。
据我了解,Ta 和Tb 都会在放置前检查,所以这里会不会出现重复键的情况。
考虑到我们已经正确覆盖了hashcode 和equals。
【问题讨论】:
-
我认为它们总是会相互覆盖。如果你没有正确同步它,你可能会得到一个并发异常。
-
你为什么这么问?您肯定不打算在这种情况下使用非线程安全容器吗?
-
因为在放置之前都会检查,所以你有你的竞争条件:插入不是原子(单个不可分割)操作,但它至少包含 2 个操作当
Ta与Tb未正确同步时可能会产生干扰。 -
不,
HashMap中永远不会有重复的键,因为它是如何实现的。只会有一个竞争条件。 -
@PatrickParker 有人问我这个问题,我知道我可以使用同步功能,但这就像一种解决方法,我更感兴趣的是真正知道到底发生了什么,就像我可以说的那样,
read might happen在put call之前,所以它可能返回 null,但我担心的是同时写入同一个对象
标签: java hash collections hashmap