线程安全和线程兼容的区别是什么?

10

什么是线程安全和线程兼容的区别?

  • 线程兼容的含义是什么?
  • 线程兼容的用例是什么?

更新:我在流观察者的grpc文档中找到了这个定义。

此外,我还找到了描述线程安全性的文章,但对我来说仍不清楚。

如果一个方法要求在同步块中执行,那么这意味着它只是线程不安全的吗?


2
能否提供一些关于“线程兼容”这个术语的背景信息呢?我甚至从未听说过。我想区别在于用户需要多大程度地确保API的使用方式是“线程安全”的。 - user2982130
即使我从未听说过“线程兼容”这个词,你能发布源的完整上下文吗? - Ravi
我已经更新了问题并提供了上下文信息。 - mkUltra
似乎这个术语是在“Effective Java第一版”中被创造的 - 请看下面我的回答。 - David Soroko
1
这里有另一个框架文档提到了这个术语,https://beam.apache.org/documentation/programming-guide/#requirements-for-writing-user-code-for-beam-transforms - Adelin
3个回答

8

线程安全是指一个对象可以被多个线程同时使用而仍然正确。

线程不安全是指该对象执行某些操作(更改静态状态、线程本地存储等),从而导致其无法保证线程安全。

线程兼容是指既不是线程安全,也不是线程不安全 - 因此要满足线程安全性,用户必须自己执行同步。


1 但正确性的定义略有不同...

Java In Theory And In Practice 根据类的规范来定义这个概念。

Google 的 Geoff Romer 和维基百科将其定义为简单地缺乏数据竞争。

我通常希望它意味着没有崩溃、死锁或其他意外情况。


1

线程安全意味着对象可以在多个线程中并发使用,这是由Java自身实现的;虽然线程兼容不是线程安全的,但当您在非线程安全代码中包围一些同步代码或拥有包装器对象时,它仍然可以安全地并发使用。也就是说,您需要自己实现线程安全。


0

看起来线程兼容的定义源自于Joshua Bloch的Effective Java第一版。不管它值不值得,它在第二版中已经不存在了。在第二版中,我们有以下分类:

  • 不可变
  • 无条件线程安全
  • 有条件线程安全
  • 非线程安全
  • 线程敌对

在我看来,线程兼容被重命名为非线程安全


你为什么这样想呢?在我看来,它被重命名为 条件线程安全。Beam 的文档使用了术语“线程兼容”,就像 条件线程安全 的含义一样。(https://beam.apache.org/documentation/programming-guide/#requirements-for-writing-user-code-for-beam-transforms) - Jason Kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接