【高并发系列】4、volatile

并发编程系列之volatile关键字详解 volatile是什么?volatile是Java中的一个关键字,也是一种同步机制。volatile为了保证变量的可见性,通过volatile修饰的变量具有共享性。修改了volatile修饰的变量,其它线程是可以读取到最新的值的 阅读详情

1、volatile关键字不能代替锁来保证复合操作的原子性:

public class VolatileDemo {
	private static volatile int i = 0;
	public static class PlusTask implements Runnable {
		@Override
		public void run() {
			for (int k = 0; k < 10000; k++) {
				i++;
			}
		}
	}
	public static void main(String[] args) throws InterruptedException {
		Thread[] threads = new Thread[10];
		for (int i = 0; i < 10; i++) {
			threads[i] = new Thread(new PlusTask());
			threads[i].start();
		}
		for (int i = 0; i < 10; i++) {
			threads[i].join();
		}
		System.out.println(i);
	}
}

因为i++的操作不能保证原子性,i累加结果都会小于100000;

2、在server模式下,由于系统优化导致ReadThread线程无法感知到主线程中所做的修改,导致ReadThread无法退出,可以给ready变量增加volatile关键字,ReadThread对ready变量就可见了;

public class NoVisibility {
	private static boolean ready;
	private static int number;
	private static class ReadThread extends Thread {
		@Override
		public void run() {
			while (!ready) {
			}
			System.out.println(number);
		}
	}
	public static void main(String[] args) throws InterruptedException {
		new ReadThread().start();
		TimeUnit.SECONDS.sleep(1);
		number = 42;
		ready = true;
		TimeUnit.SECONDS.sleep(2);
	}
}

3、查看JDK的运行模式

java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

其中Server VM表明是Server模式运行;

深入解析AutoConfigURL劫持:从注册表权限到一键修复 本文深入解析了AutoConfigURL劫持的原理,揭示其通过篡改注册表权限锁定浏览器设置的机制。文章提供了从手动修复注册表权限到使用一键修复工具的详细解决方案,并指导用户进行DNS检查与病毒查杀,以彻底根除此类顽固劫持问题。 阅读详情

相关推荐

使用Kolla部署多节点Rocky版本OpenStack

openstack命令行客户端使用,post-deploy会在 /etc/kolla/目录下生成文件admin-openrc.sh。每次使用openstack命令时执行source /etc/kolla/admin-openrc.sh(manager节点执行)source /etc/kolla/admin-openrc.sh (将文件内容复制到/etc/profile中,即可一直生效)3.2.2 开始安装kolla-ansible,要带上--ignore-installed PyYAML,否则可能会报错。

gyc1206的博客 1926

java进阶(4)之volatile关键字深入详解

volatile作用 可见性 当有多个线程共用一个变量,有线程读,有线程写,那么就有可能导致有的线程无法及时读取到另外线程修改后的变量的值。volatile关键字可以让其他线程立即看到变量的最新值。 有序性 终端设备为了加快运行速度,会让编译器和处理器进行指令重排序,有可能会导致上下两句代码的执行顺序不一致。volatile关键字看可以禁止指令重排序,保证代码语句按顺序执行。 CPU多级缓存模型 ...

罗小辉的专栏 629

别再手动拷贝文件了!用Keil MDK的Pack Installer一键搞定STM32上的RT-Thread Nano移植

本文详细介绍了如何使用Keil MDK的Pack Installer一键快速移植RT-Thread Nano到STM32项目,告别繁琐的手动拷贝和配置过程。通过自动化版本管理和依赖处理,移植时间从47分钟缩短至3分钟,大幅提升开发效率。文章还提供了实战步骤、高级配置技巧和常见问题解决方案,帮助开发者轻松实现RTOS集成。

weixin_29194817的博客 363

java高并发系列 - 第7天:volatile与Java内存模型

java高并发系列第7篇文章public class Demo09 { public static boolean flag = true; publ...

路人甲Java 830

逆向工程师必备:用MDL绕过游戏保护读取内存数据的完整流程(附POC代码)

本文深入探讨了内核级内存访问技术,重点介绍了如何利用MDL(Memory Descriptor List)机制稳定、隐蔽地绕过游戏反作弊系统读取进程内存。通过对比MmCopyVirtualMemory等方法的优劣,提供了完整的MDL映射实战代码与反检测策略,为逆向工程师在内核态进行安全内存操作提供了专业指导。

weixin_29227425的博客 624

RT-DETR目标检测模型性能评价指标详解,涉及混淆矩阵、F1-Score、IoU、mAP、参数量、计算量等,一文打尽所有评价指标

本文主要讲解的是计算机视觉网络模型的性能评价指标,这是每一篇论文中都需要展示的内容。熟悉每一个评价指标也能够帮助我们在训练和改进模型过程中,更好的观察模型的变化效果。

Limiiiing的博客 3358

多线程与高并发系列二(Synchronized和volatile)

多线程与高并发系列二(Synchronized) synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有⼀个线程执行。

一只小菜鸡的博客 800

论文深度解析:基于大语言模型的城市公园多维度感知解码与公平性提升

本文针对城市公园感知测量的精细化不足与公平性评估缺口,提出了一套融合社交媒体数据与大语言模型(LLM)的创新分析框架。通过领域适配微调开发的Park-Perception-LLM模型,实现了对感知可达性、可用性、吸引力三大核心维度83%-91%的高精度分类。将该感知指标创新性地融入增强两步浮动集水区法(E2SFCA),以香港高密度城市为案例,系统揭示了公园质量与数量的空间不平等及错配模式。借助多元回归模型,深入挖掘了公园内部特征、宏观建成环境、微观街道景观及时间因素对感知的影响机制。

May the Force be with you 1014

Java高并发4-解析volatile关键字

一、复习 二、volatile解析 1.计算机内部的内存模型 我们知道计算机内部含有内存和CPU,那么在进行计算的时候,内存读写还是太慢了,因此在内存和CPU之间还是有一个缓存cache 那么我们知道如果是一个共享变量的话,就会导致,内存中变量和缓存中的变量由于多线程同步不及时,也就是说,一个线程中的缓存还没来的急写入内存,此时有可能在内存中的变量被其他线程读取了。 解决这个问题可以:1)通过在总线加LOCK#锁的方式;2)通过缓存一致性协议 第一种方式效率低下,很难实现多线程;第二种方式有一个著名MSI

weixin_44630050的博客 294

使用Python从图像中提取表格

python 实现图片表格提取

qq_30895747的博客 2570

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

港科大livox_camera_calib虽然操作方便,但是使用mid360雷达会有视角问题(投影三维点到相机),尝试了很多场景,标定效果都不理想(推荐场景是楼梯间),看来港大的更适合avia之类窄角度的雷达。如果标定效果不好的话,就使用 getExt2节点,getExt1节点只优化外参,而getExt2节点在计算的时候会将一开始计算的内参作为初值和外参一起优化。一般使用getExt1节点即可,如果在外参初值验证过,并且异常值已经剔除后,优化还是有较大的残差,那么可以使用getExt2试一试。

z1872385的博客 2399

java高并发系列 - 第4天:JMM相关的一些概念

java高并发系列第4篇文章JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战。如何保证一个...

路人甲Java 921

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java高并发之volatile 关键字

1、

weixin_42142057的博客 1469

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java高并发架构设计原理:java的内存模型,volatile和线程数据安全

最近工作上需要使用java完成高并发的服务器后台设计,因此对此作了一些研究,于是想把研究的心得,总结,经验写出来与大家分享,顺便巩固自己的认知。java通常用来开发大型网站,特别是用来开发应对高并发的后台服务器,例如淘宝就是依赖java后台来满足每天面临的海量数据请求。 java在应对高并发上形成了一系列成熟的设计思想以及应用框架,掌握这些知识能大大扩宽一个技术人员的择业范围和技术实力,在未来十年内,在处理海量数据请求和高并发需求上,java的统治地位不会有太大的动摇。 本节我们先看java高并发设计所需的

tyler_download的专栏 766

volatile详解

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

枫陵的博客 1万+

volatile为何在高并发时候挺身而出?

既然synchronized是"万能"的,为什么还需要volatile呢? volatile的附加功能 除了前面我们提到的volatile比synchronized性能好以外,volatile其实还有一个很好的附加功能,那就是禁止指令重排。 我们先来举一个例子,看一下如果只使用synchronized而不使用volatile会发生什么问题,就拿我们比较熟悉的单例模式来看。 我们通过双重校验锁的方式实现一个单例,这里不使用volatile关键字: 1 public class Singleton {

AdolfQiu的博客 311

C++面试基础系列-volatile

总结来说,C和C++中的volatile在基本用途上相似,但C++标准提供了更明确的定义,尤其是在多线程环境中。在C++中,如果需要原子性或线程安全的同步,应该使用std::atomic或其他同步机制,而不是仅仅依赖volatile。总结来说,volatile 在嵌入式系统中是一个关键的关键字,用于确保变量的值能够反映出最新的状态,特别是在中断服务程序和多线程环境中。然而,开发者应当谨慎使用,避免滥用,同时注意它并不能替代其他同步机制来保证操作的原子性。的深入理解可以体现候选人的专业知识和经验。

wesigj的博客 2213

Java中的volatile

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

HGW的博客 2万+

一文了解volatile高并发关键字

声明:尊重他人劳动成果,转载请附带原文链接!学习交流,仅供参考! 文章目录1、volatile是什么?2、volatile实用那些场合?2.1 不适合场景 a++(递增或者递减,含有依赖关系的)2.2 适合场景2.2.1 赋值操作2.2.2 触发器4、volatile总结 1、volatile是什么? 1、volatile是一种同步机制,和synchroized、Lock两者之比,更加轻量,因为使用volatile并不会发生上下文切换等开销很大的行为。 2、如果一个变量被volatile修饰,那么.

一直AC丶 360

4、volatile

1. volatile简介 自我总结: synchronized: 具有原子性,有序性和可见性;volatile:具有有序性和可见性 另外的参考资料: https://blog.youkuaiyun.com/yinbucheng/article/details/71305951 在for()循环或者while()内容中对voilate赋值不生效。 for (Node<E> h = h...

NEW_BUGGER的博客 453

并发系列之volatile解析

并发系列之volatile解析1、volatile简介2、可见性3、有序性4、往期佳文4.1、面试系列4.2、技术系列4.3、源码系列4.4、数据结构和算法系列4.5、多线程系列 1、volatile简介        volatile 具有可见性和有序性的特性,同时,对 volatile 修饰的变量进行单个读写操作是具有原子性。 2、可见性        简单的说,就

Java学习之乐的博客 415

JAVA高并发之volatile详解

volatile 介绍 1. 缓存的概念,为什么要有缓存? 在未采用缓存的之前,CPU都是直接访问主内存、虽然随着CPU制造工艺的提升,刷新频率的提高,内存受限于制造工艺和制造成本的限制,提升空间较小,导致了CPU与主线程访问频率过高,通过传统的FSB直接访问内存的方式会导致CPU资源受到很大的限制,为了降低CPU吞吐量,在CPU和主存中间加了缓存的设计。 2. 缓存运行方式以及缓存不一致性的问题 在程序运行的时候,会将所需要的共享数据从主内存中拷贝一份放置缓存中,计算结束之后、在刷新之主内存中。 多个线程

misslee123456的博客 197

JVM系列之:从汇编角度分析Volatile

文章目录简介重排序写的内存屏障非lock和LazySet读的性能总结 简介 Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了。Volatile是JMM(Java Memory Model)的一个非常重要的关键词。通过是用Volatile可以实现禁止重排序和变量值线程之间可见两个主要特性。 今天我们从汇编的角度来分析一下Volatile关键字到底是怎么工作的。 重排序 这个世界上有两种重排序的方式。 第一种,是在编译器级别的,你写一个java源代码,经过javac编译之后,生成的字节码顺序可

程序那些事 9003

【java】Java并发编程系列- volatile关键字(高并发中特实用哦)

主要讲解volatile的相关知识,以及容易遇到的坑。volatile可以保证线程可⻅性且提供了⼀定的有序性,但是⽆法保证原⼦性。在JVM底层volatile是采⽤“内存屏障”来 实现的。它确保指令重排序时不会把其后⾯的指令排到内存屏障之前的位置,也不会把前⾯的指令排到内存屏障的后 ⾯;即在-执⾏到内存屏障这句指令时,在它前⾯的操作已经全部完成;它会强制将对缓存的修改操作⽴即写⼊主存;如果是写操作,它会导致其他CPU中对应的缓存⾏⽆效。

DreamSun的博客 679

Volatile系列(一):Volatile测试案例一可见性

多线程是 JAVA 并发编程的主要应用,并发环境能大幅提高应用性能,提高 CPU 使用率,但是并发环境下也引出许多问题。今天咱们主要探讨的就是多线程并发中的一个关键字:Volatile。内存可见性禁止指令重排序。

Show Me The Code 1026
上一篇: 【高并发系列】3、线程那些事儿
下一篇: 【高并发系列】5、线程组
hellboy0621
博客等级 码龄9年 61粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值