我有一个普遍的问题,我不太明白。
如果使用线程不安全的集合,会有什么竞争条件和后果?
例如,java.util.HashSet不是线程安全的。那种竞争条件和后果是什么?有人可以列出这些并提供一些详细的解释吗?
谢谢。
答案 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.