在实践中的java并发中,作者提出了这两个类:
我不明白为什么第一个不是线程安全的。他谈到过时数据的可能性,这种情况下的陈旧数据以及如何在这里重现过时的数据情况?
在使用多线程的MutableInteger类时,我不明白这里会出现什么问题。
答案 0 :(得分:1)
问题在于,默认情况下,允许JVM在处理多个线程时执行许多技巧。它可以是例如重新排序语句,跨线程复制变量和其他东西。
MutableInteger
:
SynchronizedInteger
如何更好?输入synchronized
方法(或块)会强制JVM执行以下两项操作:
因此,在上面的示例中,线程1在调用get()
时将收到3,而不是之前的5。
顺便说一句,对于基元(int,char,float ...),您可以使用volatile
关键字强制更改立即对所有线程可见。或者,使用内置AtomicInteger
和朋友,以获得比synchronized
方法更好的性能。