volatile关键字的原理和要避免的误区

news2024/9/22 23:16:00

1>防止指令重排

2>禁用工作内存缓冲区,直接使用主内存。

经典使用场景

场景1

public static Singleton getInstance() {

//第一次null检查

if (instance == null) {

synchronized (Singleton.class) { //1

//第二次null检查

if (instance == null) { //2

instance = new Singleton();//3

}

}

}

return instance;

}

如果不用volatile,则因为内存模型允许所谓的“无序写入”,可能导致失败 。某个线程可能会获得一个未完全初始化的实例。

场景2

private vola

tile int value;

//读操作,没有synchronized,提高性能

public int getValue() {

return value;

}

//写操作,必须synchronized。因为x++不是原子操作

public synchronized int increment() {

return value++;

}

这段代码,可实现一个线程间安全的计数器。因为加了valatile关键字。每次线程都能取到最新值做加减。

要避免的误区

在代码评审的时候看到volatile被滥用的情况。说说我个人的看法:很少变化,对时间不是特别敏感的情况下不建议用volatile关键字。

举个例子:从公司的配置中心取到一个配置数据。不建议用volatile。

一般来说配置中心的架构是下面这个样子

volatile关键字的原理和要避免的误区

一条数据从用户变更到集中存储的配置中心,配置中心下发到真正使用的机器上,之前公司是要经过90s(客户端90s为周期定时去配置中心取最新数据)。

加了volatile关键字在这种场景只是能更快的看到这个最新值而已。下面我们来测试下这个【更快】有多久。

public class VolatileTest {

private boolean endRun = false;

@Test

public void noVolatile() throws Exception {

Runnable r1 = new Runnable() {

public void run() {

int i = 0;

while (!endRun) {

System.out.println(“I am still running” + i++);

}

}

};

Runnable r2 = new Runnable() {

public void run() {

endRun = true;

}

};

new Thread(r1).start();

new Thread(r2).start();

Thread.sleep(9000);

System.out.println(“end run”);

}

}

这个代码里,在第一个线程使用endRun这个变量。第二个线程去改变endRun这个变量的值。一旦第一个线程看到了第二个线程的值的变化,就会马上停止循环。

运行结果如下:

volatile关键字的原理和要避免的误区

说明经过了两个循环的时间,线程就读到了另外一个线程变化的值。对照下面的时间延迟表,我们来计算下:

volatile关键字的原理和要避免的误区

平均执行一行简单代码要执行5个指令。如上执行一个指令需要1ns。每次循环执行2行代码,从运行结果来看共执行了2次。共5_1_2*2=20ns。实际数据应该不是如此,而且是变化的。但是应该都是ns级别的。
要避免的误区](https://img-blog.csdnimg.cn/img_convert/e3ce33f5d860603890fc2e97cd4ce4e7.png)

平均执行一行简单代码要执行5个指令。如上执行一个指令需要1ns。每次循环执行2行代码,从运行结果来看共执行了2次。共5_1_2*2=20ns。实际数据应该不是如此,而且是变化的。但是应该都是ns级别的。

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

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

相关文章

flink sql gateway初探

文章目录前言1.启动SQL gateway2.打开session3.执行flink SQL4.查看执行结果5.获取operationHandle的status6.注意事项7.官方链接前言 flink 1.16版本中发布了一个新功能–SQL gateway,本篇文章就来实践测试下该功能。 1.启动SQL gateway ./bin/sql-gateway.sh st…

让企业报表化繁为简,Smartbi实现报表统一管理

报表作为大家日常工作的关键和必不可少的内容,往往需要定期进行维护和更新。处在工作的不同时间、不同岗位、不同职责,要做的报表也各不相同。随着时间的推移,手上的报表也会越来越多,而这还只是从个人的角度出发来理解&#xff0…

[附源码]Python计算机毕业设计Django学生在线考试系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

java计算机毕业设计ssm洗浴管理系统l9omz(附源码、数据库)

java计算机毕业设计ssm洗浴管理系统l9omz(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。…

脉冲波形的产生和整形

一个周期性的脉冲信号,我们希望可以提供0和1的电平值 边沿的好坏,跳转时间长,效果就不好,特性就不好,所以描述周期性的脉冲信号的时候,有相应的参数,高低电平我们一般画成等宽的,尽…

深度学习入门篇 | 常用的经典神经网络模型

**神经网络,是模拟生物神经网络进行信息处理的一种数学模型。**它以对大脑的生理研究成果为基础,其目的在于模拟大脑的某些机理与机制,实现一些特定的功能。神经网络是目前最火的研究方向深度学习的基础,本文将神经网络分成三个主…

【Java面试】谈一谈你对ThreadLocal的理解

文章目录ThreadLocal原理大致设计底层理解【Java面试】说说你对ThreadLocal内存泄漏问题的理解hash冲突的解决get/set/remove方法的一些细节在多线程情况下,对于一个共享变量或者资源对象进行读或者写操作时,就必须考虑线程安全问题。而ThreadLocal采用的…

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三)

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三) 本篇目录: 六、完整构建整个[旋转的精灵女孩]实例 (1)、新建、启动webGL工程空间 (2)、构建项目的目录层次结构 (2.1…

EVE-NG安装问题记录 重置root密码

目录EVE-NG安装问题记录 重置root密码一、下载iso安装虚拟机二、碰巧没安装成功EVE-NG组件,开启EVE-NG机后 root/eve默认密码不对。进不去系统。1、进入单用户模式重置root密码三、重新安装eve-ng组件EVE-NG安装问题记录 重置root密码 一、下载iso安装虚拟机 从官…

ssm+mysql实现进销存系统|仓库计算机专业毕业论文java毕业设计开题报告

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《ssmmysql实现进销存系统》该项目采用技术:jsp springmvcspringmybatis cssjs等相关技术,项目含有源码、文档、配套开发软…

嵌入式软件开发知识点总结(二)中断Linux内核

【好文推荐】 路由选择协议——RIP协议 轻松学会linux下查看内存频率,内核函数,cpu频率 纯干货,linux内存管理——内存管理架构(建议收藏) 概述Linux内核驱动之GPIO子系统API接口 一篇长文叙述Linux内核虚拟地址空间的基本概括 中断 硬中断 …

应用开发这样做更节约成本!

现在app已逐渐取代网页端,成为一众手机用户的心头好。要想轻松拿下更多目标用户,开发一个属于自己的app显得尤为重要。那么,在应用开发方面,我们有什么妙招可以降低开发成本呢? 1、明确开发需求 做好我们的app定位&am…

【NumPy 数组索引、裁切,数据类型】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

6年测开经验,从功能测试到测试开发,我的每一步都经过了深思熟虑...

蓦然回首,软件测试风风雨雨的这几年,起初每天的工作只是鼠标点点点,我还真不知道怎么办,闲的时候真的怀疑自己的存在价值,每天拿着7000的工资,飘荡在繁华的深圳,吃不饱也饿不死,未来…

阿里 p8 私藏 MyBatis 笔记,从入门到精通,纵享源码细节

前言 越来越多的企业已经将 MyBatis 使用到了正式的生产环境,我认为流行的原因就在于绝大部分项目都是面向表结构编程的,把 Java 对象仅当成数据容器,查询和模型变更都设计在一张表上,所谓业务逻辑就是一堆增删改查的 sql 集合&a…

Cadence Allegro PCB设计88问解析(二十一) 之 Allegro中更新器件封装(Footprint)

一个学习信号完整性仿真的layout工程师 今天和大家简单介绍Allegro中如何更新PCB封装,在我们导入原理图网表,PCB的封装是必不可少的,但是可能有些为了前期布局评审,有的封装是临时的,那么就需要后续更新正确的封装。下…

02 Java起步

目录 第一章:注释 1.1 概述 1.2 Java 中的注释 第二章:关键字 2.1 概述 2.2 Java 中的关键字 第三章:标识符 3.1 概述 3.2 标识符的命名规则(必须遵守) 3.3 标识符的命名规范 第四章:数据类型以…

第十四届蓝桥杯集训——JavaC组首篇——环境搭建(win10)

还有9天就截止报名了,我们也算正式开始培训了,今年希望能取得更好的成绩。 今年的蓝桥杯从环境开始——本博客为win10电脑的Java_JDK环境搭建: 学生机环境-Java编程环境(第十四届大赛) 链接: https://pan.baidu.com…

软件测试行业真的饱和了吗?一线大厂年薪100W的测开岗位还很缺人!

在一线大厂,没有测试这个岗位,只有测开这个岗位。这几年,各互联网大厂技术高速更新迭代,软件测试行业也正处于转型期。传统的功能测试技术逐步淘汰,各种新的测试技术层出不穷,测试人员的薪资也水涨船高。与…

【Docker】基础

文章目录Docker什么是Docker虚拟机和容器Docker 底层原理Docker 优点关键技术Docker 推荐视频课程配套食用:https://www.bilibili.com/video/BV1gr4y1U7CY/?vd_source6d95a05fa9867baaa8ea7c5c52faf4e6 什么是Docker Docker,容器虚拟化技术&#xff…