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

时间:2013-11-18 04:31:14

标签: java multithreading

我有一个普遍的问题,我不太明白。

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

例如,java.util.HashSet不是线程安全的。那种竞争条件和后果是什么?有人可以列出这些并提供一些详细的解释吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

假设您的收藏集有{A, B, C}

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

您可以(例如)以{A, B, C, D}{A, B, C, E}{A, B, C, D, E}结束。

答案 1 :(得分:1)

ArrayList为例。假设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]

如果您不了解竞赛条件如何运作,请做一些研究。例如,请阅读this.