我们知道,long 和 double 赋值在 Java 中不是原子的,除非它们被声明为 volatile。我的问题是它在我们的编程实践中真的很重要。例如,如果您看到下面的类,其对象在多个线程之间共享。
/**
* The below class is not thread safe. the assignments to int values would be
* atomic but at the same time it not guaranteed that changes would be visible to
* other threads.
**/
public final class SharedInt {
private int value;
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
现在考虑另一个 SharedLong
/**
* The below class is not thread safe because here the assignments to long
* are not atomic as well as changes are not
* guaranteed to be visible to other threads.
*/
public final class SharedLong {
private long value;
public void setValue(long value) {
this.value = value;
}
public long getValue() {
return this.values;
}
}
现在我们可以看到上述两个版本都不是线程安全的。在 的情况下int
,这是因为线程可能会看到过时的整数值。在 if 的情况下long
,他们可以看到 long 变量的损坏和陈旧值。
在这两种情况下,如果一个实例没有在多个线程之间共享,那么这些类是安全的。
为了使上述类线程安全,我们需要将int 和 long 都声明为 volatile 或使方法同步。long
这让我想知道:在我们正常的编程过程中,如果分配和不是原子的,这真的很重要double
,因为两者都需要声明为易失的或同步的以进行多线程访问,所以我的问题是什么情况下,长分配的事实是不是原子的可能会有所作为?