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

iva*_*ylo 2 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.
Run Code Online (Sandbox Code Playgroud)

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

Sol*_*low 5

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

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

“线程安全”的Map含义是:

  • 如果两个或多个线程存储不同的密钥,则所有存储都会发生。
  • 如果两个或多个线程为同一密钥存储不同的值,则将至少发生一次存储。
  • 如果一个线程存储某个键的值,而另一个线程尝试获取该键的值,则读取线程将获取旧值或新值。
  • 由于多个线程访问和/或存储其他密钥,因此密钥K的值将永远不会更改。
  • 多个线程同时使用同一映射将永远不会导致JVM抛出VirtualMachineError或导致segfault。
  • 等等

请注意,以上某些示例是类本身无法阻止的竞争条件的示例。如果您使用线程安全类,则“线程安全” 并不保证您的程序将摆脱竞争条件。它仅保证该类自己的源代码不会成为程序中与线程相关的错误的原因。