java - 改变非线程安全集合

标签 java thread-safety

任何人都可以向我解释一下在 Java 中改变非线程安全且被多个线程使用的集合的后果吗?

最佳答案

结果是未定义的并且有些随机。

对于设计为快速失败的 JDK 集合,您可能会收到 ConcurrentModificationException。这确实是集合线程安全特有的唯一结果,与任何其他类不同。

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

  • 集合的内部状态可能已损坏。
  • 突变可能看起来是成功的,但事实上,其他线程在任何给定时间都可能看不到这些更改。它们可能一开始不可见,后来变得可见。
  • 这些更改实际上可能在轻负载下成功,但在重负载且存在大量线程争用的情况下随机失败。
  • 如上面评论中所述,可能会出现竞争条件。

还有很多其他的可能性,但没有一个是令人愉快的。最糟糕的是,当系统承受压力时,这些事情往往会在生产中最常见地暴露出来。

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

关于java - 改变非线程安全集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38985036/

相关文章:

java - 标签设置范围延迟(以秒为单位)

java - 基于文本的冒险游戏线程 "main"java.lang.NullPointerException 中的异常

c# - 这段代码是线程安全的还是为什么我关心 Url.Helper

java - 为什么不创建单独的线程?

java - 表中相关元素的 XPath

java - 如何将带有 ReentrantLock 的 Thread 包装到 CompletableFuture 调用中?

c++ - 此代码是从 vector 中添加和删除项目的线程安全方式吗?

ruby - 在多线程 Rails 环境中使用 Redis 的最佳方式是什么? (彪马/Sidekiq)

java - Java 中继承的坏例子是什么?

c# - SqlConnection 线程安全吗?