Java 如果使用线程不安全的集合,会有什么竞争条件和后果

Java 如果使用线程不安全的集合,会有什么竞争条件和后果,java,multithreading,Java,Multithreading,我有一个我不太明白的一般性问题 如果使用线程不安全的集合,会有什么竞争条件和后果 例如,java.util.HashSet不是线程安全的。那么,什么是种族状况和后果呢?有人能列出这些并提供一些详细的解释吗 谢谢。说你的收藏有{A,B,C} 线程1尝试添加D。 线程2尝试添加E 例如,您可以使用{A,B,C,D},{A,B,C,E},或者{A,B,C,D,E}以数组列表为例。假设ArrayList有这样一个元素:[A,B,C,D]。现在假设两个线程获取第一个元素,一个线程尝试将其设置为A.oper

我有一个我不太明白的一般性问题

如果使用线程不安全的集合,会有什么竞争条件和后果

例如,java.util.HashSet不是线程安全的。那么,什么是种族状况和后果呢?有人能列出这些并提供一些详细的解释吗


谢谢。

说你的收藏有
{A,B,C}

线程1尝试添加D。 线程2尝试添加E


例如,您可以使用
{A,B,C,D}
{A,B,C,E}
,或者
{A,B,C,D,E}

数组列表为例。假设ArrayList有这样一个元素:
[A,B,C,D]
。现在假设两个线程获取第一个元素,一个线程尝试将其设置为
A.operation()
,另一个线程尝试将其设置为
A.anotherOperation()
。您可以获得以下几种可能的结果之一:

[A.operation(),B,C,D]
[A.anotherOperation(),B,C,D]
[A.operation().anotherOperation(),B,C,D]
[A.anotherOperation().operation(),B,C,D]

如果你不明白比赛条件是如何运作的,那就做些调查吧。例如,阅读

Yes:您可能会遇到争用条件并且线程不安全。任何。。。取决于收集。“你实际上是在问,什么是比赛条件?”米奇麦和海德,请不要重复我说的话。我想知道可能发生的坏事的具体例子。谢谢。那为什么会有问题呢?两个线程添加到集合中,很好…?这将是一个问题,因为(可能取决于您的应用程序)其中只有一个是正确的。您可能丢失数据而不知道它。一个特别糟糕的例子:假设这些信件中的每一封都代表一个需要报销的客户账户。因为你的收藏不是线程安全的,就不给别人报销行吗?更糟糕!您可以看到一个版本的
a
,其中只有部分数据;例如,如果
A
本身就是一个
ArrayList
,您可能会看到它的半断信息。有很多事情会出错。