线程安全和线程兼容之间有什么区别?

时间:2018-10-09 06:20:25

标签: java multithreading concurrency thread-safety grpc

线程安全和线程兼容之间有什么区别?

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

UPD: 我在grpc documentation of StreamObserver中找到了这个定义。

我也找到了指向Characterizing thread safety的链接,但对我来说仍然不清楚。

如果某个方法需要处于同步块中,那意味着只是线程不安全吗?

4 个答案:

答案 0 :(得分:2)

线程安全意味着一个对象可以同时被多个线程使用,并且仍然是正确的 1

线程敌对意味着该对象执行了某些操作(更改静态状态,线程本地存储等),从而阻止了该对象的线程安全。

线程兼容表示不是线程安全,但不是线程恶意-因此,为了满足线程安全性,用户必须自己执行同步


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

Java In Theory And In Practice根据类的规范对此进行定义。

Geoff Romer at Google和Wikipedia将其定义为只是缺乏数据竞争。

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

答案 1 :(得分:1)

thread safe表示该对象可以安全地在多个线程中同时使用,它是由java self实现的; 尽管线程兼容不是线程安全的,但是当您在非线程安全代码中包含一些同步代码或在具有线程安全性的包装对象中并发使用时,仍然可以安全地并发使用。

答案 2 :(得分:0)

线程安全意味着多个线程对一个对象执行操作的结果是正确的。 而正确意味着同时运行的操作产生的结果与您按某种逻辑顺序依次运行所有操作的结果相同。

实际上,它实际上减少为没有种族条件和没有数据竞赛

在课程https://www.udemy.com/java-multithreading-concurrency-performance-optimization/?couponCode=CONCURRENCY中,有关于竞赛条件数据竞赛的示例的精彩解释。

强烈推荐。

老实说,我在职业生涯中从未见过“线程兼容”一词。我的猜测是,它可以在多线程代码中使用,但并不一定可以安全地用于多个线程,但是我可能是错的。线程安全性实际上是确保正确性最重要的属性。

答案 3 :(得分:0)

thread compatible的定义似乎是由于Joshua Bloch在 Effective Java 1st Edition 中引起的。不管它是值得的,它在第二版中都没有。在第二版中,我们具有以下分类法

  • 不可变
  • 无条件线程安全
  • 有条件地线程安全
  • 不是线程安全的
  • 线程敌对

在我看来thread compatible已重命名为not thread-safe