Java内存模型之原子性

news2024/10/2 14:34:07

文章目录

  • 1.什么是原子性
  • 2.Java中的原子操作有哪些
  • 3.long和double的原子性
  • 4.原子操作 + 原子操作 != 原子操作

1.什么是原子性

一系列的操作,要么全部执行成功,要么全部不执行,不会出现执行一半的情况,是不可分割的。

注意:i++ 不是原子性的,可以用 synchronized 实现原子性。

在这里插入图片描述

2.Java中的原子操作有哪些

除 long 和 double 之外的基本类型(int, byte, boolean, short, char, float)的赋值操作。

所有引用(reference)的赋值操作,不管是 32 位的机器还是 64 位的机器。

java.concurrent.Atomic.* 包中所有类的原子操作。

3.long和double的原子性

下面截图内容来自官方文档:https://docs.oracle.com/javase/specs/jls/se21/html/jls-17.html#jls-17.7

在这里插入图片描述

官方文档总结:long 和 double 是 64 位的值。出于Java编程语言内存模型的目的,对 non-volatile 的 long 或 double 值的单次写入被视为两次单独的写入:每次写入一半,即每次写入 32 位。这可能会导致线程从一次写入中看到 64 位值的前 32 位,而从另一次写入中看到后 32 位。可以使用 volatile 关键字解决该问题。

在 32 位的JVM上,long 和 double 的操作不是原子的,但是在 64 位的JVM上是原子的。

在实际开发中,商用Java虚拟机早就考虑到这一点了,会避免这种问题的发生,自动保证 long 和 double 写入时的原子性。对我们而言,不必担心 long 和 double 在 32 位机器上写入时的原子问题。

4.原子操作 + 原子操作 != 原子操作

简单地把原子操作组合在一起,并不能保证整体依然具有原子性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1378071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查

文章目录 什么是 Consul?安装和运行 ConsulAsp .Net Core 如何集成 Consul 实现服务注册和健康检查Consul.AspNetCore 中的 AddConsul 和 AddConsulServiceRegistration 方法 究竟做了什么?AddConsul 方法AddConsulServiceRegistration 方法 配置 Consul 检查服务封…

【回顾2023,展望2024】砥砺前行

2023年总结 转眼间,迎来了新的一年2024年,回顾2023,对于我来说是一个充满平凡但又充实又幸运的一年。这一年经历了很多的事情,包括博客创作、技术学习、出书、买房等,基本上每件事情都是一个前所未有的挑战和机遇、使…

科研学习|论文解读——信息世界映射方法

题目:信息世界映射的下一步是什么?在情境中理解信息行为/实践的国际化和多学科方法(What is next for information world mapping? International and multidisciplinary approaches to understanding information behaviors/ practices in …

Jmeter Linux环境压测Lottery接口

1、把Dubbo插件放到Linux中Jmeter的lib/ext目录下 2、参数化 3、设置线程数 4、把测试计划中的Dubbo路径替换成Linux中的路径 /home/apache-jmeter-5.5/lib/ext 5、上传压测脚本到压力机 6、执行压测,观察是否有消息积压 ①Jmeter中执行压测脚本 ②检查mq控制台是…

flask框架基本使用

一、使用pycharm创建项目 1.创建项目 2.调整默认终端 3.打开虚拟终端 打开终端可以看出使用的是p1的虚拟机终端了 4.pyCharm小技巧 在flask种输入一个完整并且存在的函数名称或者类明, 然后 Alt 回车,pycharm可以自动导包,不用在手动在代…

【java八股文】之多线程篇

1、简述线程、进程的基本概念。以及他们之间关系是什么 进程:是程序的一次执行的过程,是系统运行的基本单位,其中包含着程序运行过程中一些内存空间和系统资源。进程在运行过程中都是相互独立,但是线程之间运行可以相互影响。 线程…

Docker安装Redis 配置文件映射以及密码设置

安装直接docker pull redis即可,默认redis最新版 设置两个配置文件路径 mkdir -p /root/docker/redis/data mkdir -p /root/docker/redis/conf touch redis.conf // 容器挂载用conf配置文件 bind 0.0.0.0 protected-mode yes port 6379 tcp-backlog 511 timeout…

人工智能技术的突破性进展使得AI数字人的出现成为可能

随着科技的飞速发展,人机交互已成为当今社会中的热门话题。近年来,人工智能技术的突破性进展使得AI数字人的出现成为可能,其将开启一个全新的人机交互时代。 AI数字人是一种利用人工智能技术创建的虚拟人物,能够模拟真实人类的思…

androj studio安装及运行源码

抖音教学视频 目录 1、 jdk安装 2、下载安装androj studio 3 、打开源码安装运行相关组件 4、 安装模拟器 1、 jdk安装 安卓项目也是java开发的,运行在虚拟机上,安装jdk及运行的时候,就会自动生成虚拟机, jdk前面已经讲过&…

自己动手写编译器:自顶向下的自动状态机

本节我们介绍编译原理中一种新的数据结构叫自顶向下的自动状态机。前面我们在做词法解析时接触了大量自动状态机,他们存在一个缺陷那就是无法对要识别的字符串进行计数,因此当我们要判断括号对是否匹配时,使用在词法解析的状态机就处理不了&a…

C++基础算法之枚举

星光不问赶路人 岁月不负有心人 🎥烟雨长虹,孤鹜齐飞的个人主页 🔥个人专栏 期待小伙伴们的支持与关注!!! 目录 枚举算法的简介 枚举算法的运用 #特别数的和 题目描述# 输入描述# 输入输出样例# #找到最多…

机器学习+大数据项目

一、特征工程 特征清洗 特征监控 特征选择 计算每一个特征和响应变量的相关性 通过L1正则项来选择特征 训练能对特征打分的预选模型 通过特征组合后再来选择特征 通过深度学习来进行特征选择

Python笔记08-面向对象

文章目录 类和对象构造方法内置方法封装继承类型注解多态 类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作 这种套路,称之为:面向对象编程 类和对象 定义类的语法如下&#xff…

Qt 调试体统输出报警声

文章目录 前言一、方法1 使用 Qsound1.添加都文件 直接报错2.解决这个错误 添加 QT multimedia3. 加入代码又遇到新的错误小结 二、第二种方法1.引入库 总结 前言 遇到一个需求,使用Qt输出报警声,于是试一试能调用的方法。 一、方法1 使用 Qsound 1.…

Hive 数据同步

一、需求 同步集团的数据到断直连环境。 二、思路 三、同步数据(方案) 1、环境:断直连模拟环境 2、操作机器:ETL 机器 XX.14.36.216 3、工作路径:cd /usr/local/fqlhadoop/hadoop/bin 4、执行命令: 命令…

IPv6路由协议----BGP4+

BGP基本概念 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。 MP-BGP是对BGP4进行了扩展达到在不同网络中应用的目的,BGP4原有的消息机制和路由机制并没有改变。MP-BGP在IPv6单播网…

如何在“Microsoft Visual Studio”中使用OpenCV构建应用程序

我在这里描述的所有内容都将应用于 OpenCV 的界面。我首先假设您已经阅读并成功完成了 Windows 中的安装教程。因此,在进一步操作之前,请确保您有一个包含 OpenCV 头文件和二进制文件的 OpenCV 目录,并且您已按照此处所述设置环境变量 设置 O…

每日一题——LeetCode1103.分糖果 ||

方法一 个人方法: 有多少人就创建多大的数组并把数组的所有元素初始化为0,只要还有糖果,就循环给数组从头到尾添加糖果,每次分的糖果数递增1,最后可能刚好分完也可能不够,不够就还剩多少给多少。 var dis…

力扣刷题记录(28)LeetCode:797、200、463

797. 所有可能的路径 解题思路&#xff1a;回溯算法&#xff0c;当收集到的路径的最后一个值等于n-1时&#xff0c;收集答案。 参数&#xff1a;图、当前结点 class Solution { public:vector<int> path;vector<vector<int>> ans;void dfs(vector<vector…

Java获取IP地址及对应的归属地

目录 前言 一、获取访问的IP地址 二、通过IP地址获取对应的归属地 2.1 Ip2region 2.1.1 高达 99.9 % 的查询准确率 2.1.2 Ip2region V2.0 特性 2.1.3 多语言以及查询客户端的支持 2.2 Ip2region xdb Java 查询客户端实现 2.2.1 引入 Maven 仓库 2.2.2 ip2region.xdb …