在Java中写长和双是不是primefaces的?

读取和写入单个变量是primefaces的(语言保证!),除非变量的类型为long或double。

我正在读一个课程的幻灯片,我发现写了。 这节课讲的是并发性。

任何人都可以向我解释为什么写长或双不是primefaces操作? 这让我感到惊讶。

它不是primefaces的,因为它是机器代码级别的多步操作。 也就是说,longs和double都比处理器的字长更长。

为了澄清Java的情况,除非声明为volatile否则不会以primefaces方式读取或写入双精度数和长数

JLS – 双重和长期的非primefaces疗法

Java编程语言内存模型,对非易失性long或double值的单个写入被视为两个单独的写入:每个32位一半写入。 这可能导致线程从一次写入看到64位值的前32位,而从另一次写入看到第二次32位的情况。

阅读maaartinus的回答@Java中的哪些操作被认为是primefaces的?
阅读Jon Skeet @的答案当原始数据类型在Java中不是线程安全的时候?

根据JLS,您可以通过将其声明为volatile来对double和long进行读写操作。 但这并不能确保++成为primefaces。 这需要concurrent.atomic包。
阅读Louis Wasserman的回答 。

还有这个博客和评论。

Java long和double在32位机器中不是primefaces的,而在具有64位JVM的64位机器中是primefaces的。 为什么它依赖于机器位长? 因为32位机器需要长时间两次写入(长度为64位)。 阅读此详细信息。

许多程序员必须在实践中的java并发中阅读“3.1.2。非primefaces64位操作”中的这个陈述。 我已经提到了最新的JLS 17.7。 双primefaces和非primefaces的非primefaces化处理 。 他们现在仍然没有声称64位jVM是常态。 因此,64位操作被分解为32位操作,这些操作破坏了primefaces性并且在multithreading环境中使用是危险的,直到声明为volatile。 java中的long和double是64位长。 因此,java中的写入和读取操作不是primefaces操作。