java - 线程安全是否意味着没有竞争条件?

标签 java multithreading thread-safety race-condition thread-synchronization

ConcurrentHashMap 是线程安全的,但可能会出现竞争条件,因为据我所知,只有部分映射被锁定并且仅用于写入操作,这意味着如果同时有读取操作,就会出现竞争条件。

但我也喜欢看这里https://en.wikipedia.org/wiki/Thread_safety

Thread safe: Implementation is guaranteed to be free of race conditions when accessed by multiple threads simultaneously.

我能说 ConcurrentHashMap 是线程安全的,但不是完全同步的吗?这里的正确术语是什么?

最佳答案

我不知道“线程安全”有正式的定义。

当人们说某些 是线程安全的时,他们通常是指多个线程并发使用类方法不会导致阅读类文档的合理程序员感到惊讶的行为。

Map 的“线程安全”意味着:

  • 如果两个或多个线程存储不同的键,所有的存储都会发生。
  • 如果两个或多个线程为同一个键存储不同的值,则至少会发生其中一个存储。
  • 如果一个线程存储一个键的值,而另一个线程试图获取该键的值,那么读取线程将获取旧值或新值。
  • key K 的值永远不会因为多个线程访问和/或存储其他 key 而改变。
  • 多个线程并发使用同一个映射永远不会导致 JVM 抛出 VirtualMachineError,或导致它发生段错误。
  • 等等

请注意,上面的一些例子是类本身无力阻止的竞争条件的例子。 “线程安全”不是如果您使用线程安全类,您的程序将不会出现竞争条件的 promise 。它只 promise 类自己的源代码不会成为您程序中与线程相关的错误的原因。

关于java - 线程安全是否意味着没有竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58720109/

相关文章:

c# - 与缓存交互时的线程安全

java - 为什么在 Java 中双重检查锁定被破坏?

python - 如何在pyqt中同时运行两个不同的线程

ruby - ruby 中的线程安全

java - 莫贾拉 2.2.6 和 EL 3.0 : Wrong number of arguments in h:commandButton action attribute

java - 替换特定数字 - For 循环

java - 从 Eclipse 部署到 Tomcat

java - LinkedLIst indexOf递归实现

java - 线程池通信

java - JVMTI SuspendThread 和 Javas thread.suspend 有什么区别?