Mutate非线程安全集合

时间:2016-08-16 21:50:44

标签: java thread-safety

有人可以向我解释一下在java中变异集合的后果,这个集合不是线程安全的并且被多个线程使用了吗?

3 个答案:

答案 0 :(得分:0)

结果未定义且有些随机。

对于旨在快速失败的JDK集合,您可能会收到ConcurrentModificationException。这是与集合相关的线程安全特有的唯一结果,而不是任何其他类。

通常可能出现线程不安全类的问题:

  • 集合的内部状态可能已损坏。
  • 突变似乎是成功的,但事实上,在任何给定时间,其他线程都可能看不到这些变化。它们最初可能是不可见的,后来会变得可见。
  • 在轻负载下,这些更改实际上可能会成功,但在负载很重的情况下会随机失败并且会有很多线程争用。
  • 可能会出现种族情况,如上面的评论所述。

还有很多其他的可能性,其中没有一个令人愉快。最糟糕的是,当系统受到压力时,这些事情往往最常见于生产中。

简而言之,你可能不想这样做。

答案 1 :(得分:0)

无法保证数据结构的不变量。

例如: 如果线程2在线程1添加到DS线程时执行读取,则可以考虑添加此元素,而线程2没有看到该元素已被添加。

有许多非线程安全的数据结构在多线程环境中仍然可以正常运行(即不抛出),在某些情况下它们甚至可能正常运行(如果你没有做任何事情)写入数据结构)。

要完全理解这个主题,建议探索并发系统中出现的不同类别的错误:这个简短的文档似乎是一个好的开始。

http://pages.cs.wisc.edu/~remzi/OSTEP/threads-bugs.pdf

答案 2 :(得分:0)

最常见的结果是看起来有效,但不会一直有效。

这可能意味着您遇到了一个问题

  • 适用于一台机器,但不适用于另一台机器。
  • 工作了一段时间,但显然是无关的变化和你的程序中断。
  • 如果您有错误,如果您没有使用线程安全数据结构,则不知道它是否是多线程问题。

可能会发生什么;

  • 你很少/随意得到错误和奇怪的行为
  • 您的代码进入无限循环并停止工作(HashMap用于执行此操作)

唯一的选择是;

  • 限制线程之间共享的状态量,理想情况下根本没有。
  • 要非常小心数据的更新方式。
  • 不依赖于单元测试,你必须了解代码的作用,并确信它在所有可能的情况下都能正常运行。