Java多线程--volatile关键字

并发编程的三大特性

  • 可见性
  • 有序性
  • 原子性

可见性

为什么会有可见性问题?

多核CPU 为了提升CPU效率,设计了L1,L2,L3三级缓存,如图。
在这里插入图片描述
如果俩个核几乎同时操作同一块内存,cpu1修改完,当下是对cpu2不可见的。
为了解决这个问题,CPU厂商设置了缓存一致性协议.

缓存一致性协议

有序性

为什么会有有序性问题?

CPU在操作内存时,因为cpu高速内存的传输效率(寄存器)要比内存的效率快得多,
所以cpu在等待内存传输的过程中,也会顺序执行一些其他内存操作,
简单理解就是:为了提升CPU的利用效率,可能会导致原定操作的乱序

object = new Object的顺序操作
  1. new 开辟一块空间并赋默认值(null, 0)
  2. 调用构造方法并赋初始值
  3. 返回内存地址给变量

volatitle关键字

volatitle关键字怎么保证可见性的?

其实使用的是缓存一致性协议
简单理解就是当cpu修改了volatitle修饰的变量的值时 会立刻刷新到主内存区中,保证其他cpu操作时时最新值

volatitle关键字怎么保证有序性的?

使用JVM的内存屏障指令
在java编译的时候,会对加有volatitle关键字的变量 读写操作前加上jvm的内存屏障指令,保证

内存屏障指令:
内存指令,用于保证读写不允许乱序

DCL单例到底需不需要加volatile?

DCL:单例双重检查, 代码如下:

class Singleton {private static Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

需要!!!因为发生指令重拍会有问题
当线程1发生指令重排,先做了3步骤:返回内存空间给变量。还没调用构造方法时,线程2判断 instance== null为true,直接返回。线程2使用的时候会用到未调构造方法的变量值
此时就需要加 volatile关键字保证有序性

为什么说volatile不具有原子性?

什么是原子性?
要么全执行,要么全不执行。 0 or 1,没有中间态
例如 i++ 就可分为 读取,修改,写回,并非一个整体
多线程情况下线程不安全,不具备原子性

public class Counter {private volatile int count = 0;public void increment() {count++;}
}

如上,即使加上 volatile关键字,多线程的情况下,count数还是会有问题

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

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

相关文章

Spring Cloud 应用框架

Spring Cloud 是基于 Spring Boot 的一套工具集,用于构建分布式系统中的常见模式。它提供了服务发现、配置管理、智能路由、服务熔断、负载均衡、全链路追踪等一系列功能,帮助开发者快速构建和部署分布式微服务架构。本文将详细介绍 Spring Cloud 的核心…

APISIX的安装与测试(springboot服务测试)

安装: 1.1安装依赖: curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash -1.2 安装 OpenResty yum-config-manager --add-repo https://openresty.org/package/centos/openresty.reposudo yum i…

英语翻译程序,可以对用户自己建立的词汇表进行增删查改

⑴ 自行建立一个包含若干英文单词的词汇表文件,系统初始化时导入内存,用于进行句子翻译。 ⑵ 用户可以输入单词或者句子,在屏幕上显示对应翻译结果。 ⑶ 用户可对词汇表进行添加和删除,并能将更新的词汇表存储到文件中。 #defi…

Adobe Acrobat DC无法卸载

控制版面、电脑管家等均无法卸载,使用自身的remove也不能卸载 解决方法:删除Adobe Acrobat DC的注册表 1、首先打开注册列表: 2、根据圈出来的信息,找到以下路径: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Inst…

反序输出c++

题目描述 输入n个数,要求程序按输入时的逆序把这n个数打印出来,已知整数不超过100个。也就是说,按输入相反顺序打印这n个数。 输入 输入一行共有n个数,每个数之间用空格隔开。 输出 如题要求:一行,共有n个数&…

现如今AI大环境究竟怎样?

遇到难题不要怕!厚德提问大佬答! 厚德提问大佬答10 你是否对AI绘画感兴趣却无从下手?是否有很多疑问却苦于没有大佬解答带你飞?从此刻开始这些问题都将迎刃而解!你感兴趣的话题,厚德云替你问,你…

车载电子电器架构 —— 智能座舱技术范围(万字长文精讲)

车载电子电器架构 —— 智能座舱技术范围 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

远程连接服务器

远程连接只需要配置好地址、网关、安装openssl-devel与开启sshd服务即可远程连接。(前提是配置策略允许的。防火墙默认开启) libXdmcp-devellibXinerama-devellibXft-devellibXtst-devellibXrender-devellibXrandr-devellibXi-devel 这些文件在终端运行…

vs code 搭建 vue 开发环境

1. vs code 环境准备好 2. 安装vue环境: nodejs:官网下载安装后 输入 node -v 验证是否安装成功 vue-cli : 输入 npm install -g vue/cli 安装后,vue --versoin 验证 3. 创建项目并启动: 进入目标文件夹&#xf…

MySQL性能分析工具——EXPLAIN

性能分析工具——EXPLAIN 1、概述 定位了查询慢的SQL之后,我们就可以使用EXPLAIN或DESCRIBE工具做针对性的分析查询语句 。 DESCRIBE语句的使用方法与EXPLAIN语句是一样的,并且分析结果也是一样的。 MySQL中有专门负责优化SELECT语句的优化器模块&…

2023职称继续教育--“十四五”大数据产业发展规划

单选题(共7题,每题5分) 1、截至2021年4月,我国已经有()个省级和地市级数据开放平台。 B、174 2、在“十四五”规划中,“大数据”出现过()次。 C、43 3、我国已建设&…

如何成功完成一个Java项目答辩

目录 如何成功完成一个Java项目答辩一、准备阶段二、答辩阶段三、答辩后阶段 案例:在线图书管理系统项目背景需求分析系统架构设计核心功能展示关键代码展示测试结果遇到的问题及解决方案总结与未来展望 如何成功完成一个Java项目答辩 在编写这篇博客时&#xff0c…

Android Dialog软键盘弹出问题完美解决办法

一、问题: Dialog中有输入框时,显示后无法自动弹起软键盘,原因就不赘述了,自行Google。 一、解决办法: 开启独立线程,线程中使用while循环,循环调用弹起软键盘方法,直至showSoftI…

FreeRTOS基础(五):任务挂起与恢复

今天我们将探讨FreeRTOS中的两个非常重要的函数:任务挂起和恢复函数。在实际的嵌入式系统开发中,我们常常需要在特定条件下暂停某些任务的执行,而在满足某些条件后再恢复这些任务的执行。这就像我们日常生活中的“暂停”和“继续”按钮。无论…

js扣代码

调试的时候保持一致.参数一致.注意断点位置,否则会有作用域问题 new之后this的问题. 改函数名字是为了方便. 关于对象两种方案.滞空,完全不去管. 对象不能直接参与计算,一定是对象里的属性方法. 不管的情况,需要写日志笔记,方便检索到位置.建议唯一性.快速检索定位. 出现上述不…

SQL深度解析:从基础到高级应用

SQL(Structured Query Language)是用于管理关系型数据库的语言,广泛应用于数据管理、分析和查询。本文将详细介绍SQL的基础知识、高级特性以及一些常见的代码示例,帮助您全面掌握SQL的应用。 一、SQL基础语法 数据库操作 创建数据…

【Kubernetes】Pod理论详解

一、Pod基础概念: Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行…

Unix、Linux 软件包管理快速入门对照

Linux(RHEL、Ubuntu)或者 Unix(macOS、FreeBSD)可以参看下表快速入门: 命令功能/系统Darwin (macOS)FreeBSDDebian/UbuntuRHEL(dnf yum)搜索和查找软件包brew searchpkg searchapt listyum list查看软件包…

生态系统服务功能之碳储量

大家好,这期开始新生态系统服务功能即碳储量的计算,这部分较简单,下面让我们开始吧!!! 碳储量的计算公式 生态系统通过从大气中释放和吸收二氧化碳等温室气体来调节地球气候,而森林、 草原和沼…

基于Open3D的点云处理23-Web可视化

Open3D Web 可视化工具可在现代浏览器中实现3D 模型的高级渲染和可视化。 首先在本地或远程计算机上启动可视化服务器,然后可以从任何具有现代浏览器的设备上查看3D 模型。Web 可视化服务器和客户端通过WebRTC(Web 实时通信)协议进行通信。 将Open3D Web 可视化服务器作为独…