long和double的非原子性协定

Java内存模型要求lock、unlock、read、load、assign、use、store、write这8个操作都具有原子性,但是对于64位的数据类型(double、long)定义了相对宽松的规定:允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次的32位操作来进行,即允许虚拟机可以不保证64位数据类型的load、store、read和write操作的原子性。

非原子性协定可能导致的问题
如果有多个线程共享一个未申明为volatile的long或double类型的变量,并且同时对其进行读取和修改操作,就有可能会有线程读取到"半个变量"的数值或者是一半正确一半错误的失效数据。

在实际应用中的解决
因为上述可能造成的问题,势必在对long和double类型变量操作时要加上volatile关键字,实际上如下:

1、64位的java虚拟机不存在这个问题,可以操作64位的数据

2、目前商用JVM基本上都会将64位数据的操作作为原子操作实现

所以我们编写代码时一般不需要将long和double变量专门申明为volatile

【多线程】long和double的非原子性协定相关推荐

  1. volatile非原子性示例

    volatile非原子性示例 学习了:<Java多线程编程核心技术>高洪岩 著 Page124 package com.stono.thread2.page124_2;public cla ...

  2. Java多线程:线程安全和非线程安全的集合对象

    转载自  Java多线程:线程安全和非线程安全的集合对象 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到 ...

  3. 关于MFC下多线程,在线程中创建非模态对话框以及消息传递

    2019独角兽企业重金招聘Python工程师标准>>> 关于MFC下多线程,在线程中创建非模态对话框以及消息传递 问题: 1.在子对话框中它的子对话框需要实现脱离父对话框的束缚.(因 ...

  4. java 原子long_java中long和double类型操作的非原子性探究

    Java中的原子操作包括: 1)除long和double之外的基本类型的赋值操作 2)所有引用reference的赋值操作 3)java.concurrent.Atomic.* 包中所有类的一切操作. ...

  5. java i 非原子性_java i++ 非原子操作

    java i++ 非原子操作 i++ 不是原子操作, 也就是说, 它不是单独一条指令, 而是 3 条指令: 1, 从内存中把 i 的值取出来放到 CPU 的寄存器中 2,CPU 寄存器的值 + 1 3 ...

  6. 并发编程之多线程基础-守护线程与非守护线程(四)

    守护线程概念: 只要当前JVM实例中尚存在任何一个非守护线程没有结束, 守护线程就全部工作; 只有当最后一个非守护线程结 束时, 守护线程随着 JVM 一同结束工作. 守护线程最典型的应用就是 GC ...

  7. 多线程基础-守护线程与非守护线程

    守护线程与非守护线程 1.线程分类: 2.程序线程: 3.主线程与非守护线程 4.主线程与守护线程 5.主线程.守护线程.非守护线程 6. java虚拟机是如何退出的? 1.线程分类: 守护线程 非守 ...

  8. Qt多线程间信号槽传递非QObject类型对象的参数

    一.以前就发现过这个问题: 在Qt项目中,有时候为了让自己的类,可以重载操作符 '=','<<','>>'. 也有时候需要用一个类进行文件的读写,所以很多C++类还是要简单化的 ...

  9. Java内存模型、volatile、原子性、可见性、有序性、happens-before原则

    目录 1.硬件的效率与一致性: 缓存一致性(Cache Coherence) 2.Java内存模型 2.1主内存与工作内存 2.2内存间的交互 2.3 volatile型变量的特殊规则 2.3.1 保 ...

最新文章

  1. rose 2003 7.0_安卓微信7.0.17正式版更新:十大新鲜功能~
  2. Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist的
  3. 插入数据到hive_Hive实现网站PV分析
  4. SpringBoot 精通系列-创建SpringBoot的入门项目
  5. 一个RSS阅读器的源码,不敢独享!
  6. 概率论 方差公式_概率论与数理统计课程教学、学习基本要求和教学建议
  7. ImportError: DLL load failed: 找不到指定的模块。Import tensorflow时
  8. Ubuntu 18.04安装codeblocks 17-12
  9. IAR基础教程之函数跳转
  10. 学习笔记 | Inverting Gradients--How easy is it to break privacy in federated learning
  11. hdu多校(三)1004 Tokitsukaze and Multiple(easydp)
  12. C# - 此应用无法在你的电脑上运行
  13. 抖音短视频实操:抖音热门视频的分类特点,如何选择视频内容(中)
  14. Mac如何共享wifi热点
  15. Polarion舍与得——主机厂与供应商的ASPICE博弈
  16. 国内如何打开 Coursera?(Mac系统)
  17. 计算机图形学:二维图形的几何变换(算法原理及代码实现)
  18. 解决电脑开机-EFI PXE 0 for IPv4(XX-XX-XX-XX-XX-XX) boot failed.问题
  19. 硬件设计——外围电路(电源电路)
  20. 9.17 hive高级语法01

热门文章

  1. 量化交易---主要流程---003
  2. 关于c / c++中power_bound的使用
  3. 华为OD机试 - 预订酒店(Java JS Python)
  4. Node 插件 爬取王者荣耀官网英雄信息,并生成数据库
  5. 详解旨在提升EVM底层性能的兼容公链Monad
  6. 分布式计算原理之分布式协调与同步(1)——分布式选举
  7. 富途证券 8.14
  8. 如何在Windows 10中打开设置?
  9. Kali使用Metasploit内、外网渗透windows系统
  10. 技术方向决策的几点思考