为什么MutableInteger不是线程安全的?

时间:2018-05-14 21:45:51

标签: java multithreading

在实践中的java并发中,作者提出了这两个类:

enter image description here

我不明白为什么第一个不是线程安全的。他谈到过时数据的可能性,这种情况下的陈旧数据以及如何在这里重现过时的数据情况?

在使用多线程的MutableInteger类时,我不明白这里会出现什么问题。

1 个答案:

答案 0 :(得分:1)

问题在于,默认情况下,允许JVM在处理多个线程时执行许多技巧。它可以是例如重新排序语句,跨线程复制变量和其他东西。

MutableInteger

可能出现什么问题
  • 线程1调用set(5)
  • 线程2调用set(3)
  • 线程1调用get()并接收5(而不是3)作为结果,即使线程2已经完成对它的调用set(3)。

SynchronizedInteger如何更好?输入synchronized方法(或块)会强制JVM执行以下两项操作:

  • 一次只能输入一个线程,所有其他线程必须等待(独占锁定)AND
  • 同步目标的所有更改在退出块时立即对所有线程可见

因此,在上面的示例中,线程1在调用get()时将收到3,而不是之前的5。

顺便说一句,对于基元(int,char,float ...),您可以使用volatile关键字强制更改立即对所有线程可见。或者,使用内置AtomicInteger和朋友,以获得比synchronized方法更好的性能。