volatile

volatile的使用场景 参考:https://www.ibm.com/developerworks/cn/java/j-jtp06197.html 总结 其实换个角度,非常简单能够理解和应用: 一个引用指明了一个内存的地址,地址上有引用反映出来的值。 比如:Integer i = 1 ; 引用 i 指向 一个地址 0x10101 地址 0x10101 上的值为 1 ; 为了线程安全,volatile能修... 阅读详情

之前写了一篇java内存模型的文章,里面涉及了volatile的规则。在这里说下我的理解。

首先java内存模型解决了在不同平台和系统中相同的内存访问效果。其次它又定义了一些规则来解决缓存一致性的问题。其中一条规则就是volatile规则。

一个变量被volatile修饰后,就会多了两个语义:

1、volatile修饰后的变量修改后立即对其他线程可见。

2、volatile修饰的变量不会被指令重排序

注:指令重排序(即使编译器和操作系统层面为了优化代码执行速度可能都会进行指令重排序)

第一个语义能保证可见行。第二个语义能保证有序性。离线程安全就差原子性了。

实现原理:

 在深入理解java虚拟机一书中讲到:

在有volatile修饰后的变量生成的汇编代码中会出现一个lock前缀。(内存栅栏)

它能保证以下几点

1、在其前面的指令不允许排序到它后面,在它后面的指令不允许重排序到其前面

2、修改后要立即刷新会主内存

3、对主内存的写入操作会使其他缓存失效(高速缓存中的变量不能用了,要用就在取一次)

应用:

由于volatile 只能无法保证原子性。所以volatile使用的时候还是要小心。使用时最好满足下面的条件

1、这次的值与上次没有任何关系(与之相反的就是我这次的值需要通过上次的值根据某种算法算出来)

2、不与其他变量参与对象的不变性条件

像是先判断后执行的操作且判断的条件与上次的值没有关系的时候。就可以用volatile 保证线程安全了。

Java千百问_03基础语法(014)_volatile关键字有什么用 点击进入_更多_Java千百问1、volatile关键字有什么用volatile是java语言的关键字,是变量修饰符。它是被设计用来修饰被不同线程访问和修改的变量。volatile的作用是: 作为指令关键字,确保本条指令不会被编译器优化,且应用的所有线程读取这个变量的值是一致的。简单的说,就是禁止编译器对代码进行优化,且强迫所有线程从共享内存读取该变量(而不是读取寄存器中的备份),变量发生改变时强行 阅读详情

相关推荐

实战指南:基于ELK与Grafana构建天融信防火墙日志可视化看板

本文详细介绍了如何基于ELK与Grafana构建天融信防火墙日志可视化看板,包括环境准备、日志收集与解析配置、Elasticsearch存储优化、Grafana看板设计等关键步骤。通过实战案例和优化技巧,帮助用户高效处理天融信防火墙日志,实现安全态势的可视化监控与分析。

weixin_34246529的博客 226

掉了两根头发,可算是把volatile整明白了

为什么只能保证可见性?又是怎么实现禁用指令重排?哇,原来这么简单

成都彭于晏 2万+

T2T基因组组装实战指南:从数据到完整染色体

本文详细介绍了T2T基因组组装技术的实战指南,从测序数据选择到完整染色体组装的全流程。重点解析了ONT ultra-long和PacBio HiFi测序技术的优势,以及如何攻克端粒和着丝粒等重复区域的组装难题。通过具体案例和实用技巧,帮助研究人员实现从数据到完整染色体的高质量组装。

weixin_29292535的博客 846

volatile详解

一. volatile的内存语义 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内中 当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量 所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取 二.volatile变量的读写过程 Java内存模型中定义的8种工作内存与主内存之间的原子操作: read(读取) -> l...

枫陵的博客 1万+

AirSim中图像API的应用

解析Airsim图像获取保存的api

fegxg的博客 1607

【架构师面试-缓存与搜索-1】-缓存与缓存置换策略源码实现

1:什么是缓存 缓存:加速数据访问的存储,降低延迟(latency),提升吞吐量(Throughput)的利器。 1:缓存演进历史 1. 查库 2. ConcurrentHashMap 3. LRU 4. Guava Cache 5. 分布式缓存(redis,MemCache) 6. 多级缓存 2:在什么地方加缓存 缓存对于每个开发者来说是相当熟悉了,为了提高程序的性能我们会去加缓存,但是在什么地方加缓存,如何加缓存呢? 举个栗子:假设一个网站,需要提高性能,缓存可以放在浏览器,可以放

chongfa2008的博客 6440

Java中的volatile

​ volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。为了能比较清晰彻底的理解volatile,我们一步一步来分析。首先来看看如下代码 上面这个例子,模拟在多线程环境里,t1线程对flag共享变量修改的值能否被t2可见,即是否输出 “-----flag被设置为

HGW的博客 2万+

ST7789驱动实战:从SPI时序到RGB565显示的完整配置解析

本文详细解析了ST7789液晶驱动芯片的SPI时序配置与RGB565显示实现,从数据手册解读到代码实战,涵盖SPI接口配置、关键寄存器设置及完整初始化流程。通过优化DMA传输和常见问题排查,帮助开发者高效驱动ST7789显示屏,适用于嵌入式显示项目开发。

weixin_29162439的博客 184

volatile关键字详解

缓存一致性协议: 每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。在多线程环境下,CPU轮流切换线程执行,有可能某个线程修改了数据,准备回主内存,此时CPU切换到另一个线程修改了数据,并且写回到了主内存,此时就导致数据的不准确。的作用就是,当某个线程工作内存中的值与主内存中的值,如果不相同就会一直。

努力分享一些干货 1837

k8s 不同node之间pod ip不通

底层k8s使用calico网络,ipip网络模式,kubevirt启动了2台虚拟机;在这两台虚拟机上再搭建k8s,calico网络,ipip网络模式。说明:我是使用helm安装的calico,改这个模式要改crd资源ippools。其他方式安装的calico修改方法可能不一样。在虚拟机上的k8s上启动了2个pod,分布在不同的node上,这两个pod不能ping通对方的pod ip。修改虚拟机之上的k8s集群的calico网络的ipipMode为Never即可,之前使用的是Always。

weixin_40548182的博客 4056

基于AI的智能开发环境—Trae在Web开发中的应用实战与性能评估【Trae项目实战】

Trae 是一款与 AI 深度集成的开发工具,提供智能问答、代码自动补全和基于 Agent 的 AI 自动编程能力,极大提升开发效率。它具备完备的 IDE 功能,如代码编写、项目管理和源代码管理等,同时还具备强大的 AI 助手,能够提供智能问答、实时代码建议、代码片段生成等服务。开发者可以通过自然语言与 AI 协作,从 0 到 1 开发项目,AI 会根据需求自动生成代码或创建文件。

一键难忘的博客 3万+

volatile变量

声明一个volatile变量,并赋值 public class VolatileTest { static volatile int i; public static void main(String[] args){ i = 10; } } 看看加了volatile之后,编译出来的字节码有什么不同,执行 javap -verbose VolatileT...

weixin_39713838的博客 453

新手必看:C#调用YOLO模型完成图片/视频目标检测(上位机版)

新手学习C#调用YOLO模型,核心是先把基础流程跑通,再逐步优化。图片检测是基础,视频检测就是在图片的基础上加循环和线程,而上位机的实际项目,就是在这个基础上适配工业硬件和业务需求。本文的代码都是新手能直接复制运行的,如果你运行时遇到问题,先检查前期准备是否到位,再看避坑指南。记住,新手别追求一步到位,先实现功能,再慢慢优化性能和界面。等你能熟练调用YOLO模型后,再去研究模型训练、量化优化等进阶内容,会轻松很多。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 988

Volatile与CAS的底层原理

Volatile与CAS的底层原理 引言:VOLATILE是JAVA中一个极其重要关键字,它保证的内存的可见性,但是并不能够保证原子性。而CAS是采用一种无锁的方式,解决VOLATILE所不能带来的原子性等这类问题。接下来,就讲讲VOLATILE与CAS吧! 一、volatile 在讲解 Volatile关键字之前,先上个小demo! private static volatile long ...

rekingman的博客 4366

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

测试volatile变量的读写性能

volatile变量与非volatile变量的区别在于,volatile变量每次读都需要去主内存读取最新的值,每次写也需要写回到主内存;非volatile变量允许在缓存中读写以加快计算速度。

@甘道夫@的专栏 3677

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

REG_OPTION_NON_VOLATILE

REG_OPTION_NON_VOLATILE: 该宏是RegCreateKeyEx函数的参数可选项。 LONG RegCreateKeyEx( HKEY hKey, LPCWSTR lpSubKey,  DWORD Reserved, LPWSTR lpClass, DWORD dwOptions, REGSAM samDesired,  LPSECURITY_ATTRI

DBA@Robin 4907

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Volatile介绍

volatile类似于大家所熟知的const也是一个类型修饰符。volatile是给编译器的指示来说明对它所修饰的对象不应该执行优化。volatile的作用就是用来进行多线程编程。在单线程中那就是只能起到限制编译器优化的作用。所以单线程的童鞋们就不用浪费精力看下面的了。 没有VOLATILE的结果       如果没有volatile,你将无法在多线程中并行使用到基本变量。下面举一个我开发项目

lifeng5055的专栏 491

c语言volatile 结构体,volatile的陷阱

例:多次的间接指针引用考察如下代码:/* DMA buffer descriptor */struct bd {unsigned int state;unsigned char *data_buff;};struct devregs {unsigned int csr;struct bd *tx_bd;struct bd *rx_bd;};volatile struct devregs * con...

weixin_29963537的博客 3460

volatile深入分析( 什么时候使用volatile)

原文:http://blog.youkuaiyun.com/vernonzheng/article/details/8201744 volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性。 什么是线程的可见性: 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁

jinfeiteng2008的专栏 1万+

volatile的实现细节

JVM是由C++实现的。 ①JVM层面。 StoreStoreBarrier volatile写操作 StoreLoadBarrier LoadLoadBarrier volatile读操作 LoadStoreBarrier 也就是volatile操作前后都加了内存屏障。 StoreLoadBarrier上面是Store,下面是Load。 LoadStoreBarrier上面是Lo...

学亮编程手记 640
上一篇: mysql修改最大连接数
下一篇: RIbbon实现SpringCloud微服务负载均衡
wlittlefive
博客等级 码龄11年 4粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值