Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在阅读时使用原子引用&;设置简单引用已经是原子操作_Java_Concurrency_Atomicity - Fatal编程技术网

Java 为什么在阅读时使用原子引用&;设置简单引用已经是原子操作

Java 为什么在阅读时使用原子引用&;设置简单引用已经是原子操作,java,concurrency,atomicity,Java,Concurrency,Atomicity,有人能澄清我对原子论的怀疑吗。由于PAR java内存模型的读取和写入引用总是一个原子操作,而不管32位或64位机器。那么在什么样的场景中使用AtomicReference将是有用的。还有其他由提供的操作,您无法使用普通引用实现 例如,为了确保要替换的值: ref.compareAndSet(expectedCurrentValue, newValue); 要获取最后一个值并替换为其他值,请执行以下操作: oldValue = ref.getAndSet(newValue); 使用,即使多个

有人能澄清我对原子论的怀疑吗。由于PAR java内存模型的读取和写入引用总是一个原子操作,而不管32位或64位机器。那么在什么样的场景中使用AtomicReference将是有用的。

还有其他由提供的操作,您无法使用普通引用实现

例如,为了确保要替换的值:

ref.compareAndSet(expectedCurrentValue, newValue);
要获取最后一个值并替换为其他值,请执行以下操作:

oldValue = ref.getAndSet(newValue);

使用,即使多个线程试图访问相同的引用,您也可以安全地执行这些操作。

您看过AtomicReference的Javadoc吗?您将发现许多方法允许您执行其他操作,而不仅仅是更改引用的值。这对那些方法很有用。@请记住,这个问题不是另一个问题的重复。标题表明了这一点,但所要求的是不同的。另一个问题没有提到java内存模型。@DanielSperry-也将帮助OP。相关问题(以及与之相关的问题)将有助于OP。如果OP有更具体的问题,我将重新打开它。JMM确保没有读或写撕裂,这将由于多个内存操作而导致数据损坏。这通常是由未对齐的内存位置引起的。易失性/原子引用会发出内存屏障,以确保线程之间的可见性。从程序员的角度来看,它们都是原子的,定义为单个不可约单元,但涉及到两个非常不同的操作。