在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操作。
- 如何在Spring Boot 1.4中的http请求中为排序参数设置IgnoreCase
- 如何通过RESTful Web服务正确生成JSON?
- 如何配置依赖于ejb jar的war并结合创建ear文件
- 如何在JBoss 5.x上使用JPA2? (或如何消除类加载隔离问题?)
- Primefaces Captcha消失或无效更新/刷新无效输入?
- 使用Bouncy Castle Java生成X509证书
- 在带有Connector / J的MySQL中使用getGeneratedKeys和批量插入
- 当str = 2011/12 / 12aaaaaaaaa时,SimpleDateFormat parse(string str)不会抛出exception?
- PHP命令shell_exec()不适用于我的自定义Java app5