尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
头歌实践教学平台:Java高级特性-多线程基础(3)线程同步(四上)
第4关使用volatile实现变量的可见性任务描述本关任务使用volatile关键字与同步实现右侧程序输出10000。相关知识在并发编程中volatile关键字扮演着非常重要的作用接下来我们直接进入主题。什么是 volatile 关键字volatile是干啥用的有什么含义和特点呢当一个共享变量被volatile修饰时它就具备了“可见性”即这个变量被一个线程修改时这个改变会立即被其他线程知道。当一个共享变量被volatile修饰时会禁止“指令重排序”。先来看个例子//线程1boolean stop false;while(!stop){doSomething();}//线程2stop true;因为线程是不直接提供停止的方法的所以我们很多时候想要中断线程一般都会采用上述代码。不过这段代码是存在问题的当线程2执行时这段代码能保证一定能中断线程1吗在大多数情况下是可以的不过也有可能不能中断线程1。为何有可能导致无法中断线程呢每个线程在运行过程中都有自己的工作内存那么线程1在运行的时候会将stop变量的值拷贝一份放在自己的工作内存当中。那么当线程2更改了stop变量的值之后但是还没来得及写入主存当中线程2转去做其他事情了那么线程1由于不知道线程2对stop变量的更改因此还会一直循环下去。如何避免这种情况呢很简单给stop变量加上volatile关键字就可以了。volatile关键字会产生什么效果呢使用volatile关键字会强制将变量的修改的值立即写至主内存使用volatile关键字当线程2对变量stop修改时会强制将所有用到stop变量的线程对应的缓存中stop的缓存行置为无效。由于线程1的stop缓存行无效所以在运行时线程1会读取主存中stop变量的值。所以到最后线程1读取到的就是stop最新的值。volatile可以保证原子性吗在之前我们了解到了线程的三大特性原子性可见性有序性。前面的例子我们知道了volatile可以保证共享变量的可见性但是volatile可以保证原子性吗我们来看看public class Test {public volatile int inc 0;public void increase() {inc;}public static void main(String[] args) {final Test test new Test();for(int i0;i10;i){new Thread(){public void run() {for(int j0;j1000;j)test.increase();};}.start();}while(Thread.activeCount()1) //保证前面的线程都执行完Thread.yield();System.out.println(test.inc);}}来想一想这段程序的输出结果然后copy到本地运行看一看效果。可能我们想的结果应该是10000不过最终运行的结果往往达不到10000可能我们会有疑问不对啊上面是对变量inc进行自增操作由于volatile保证了可见性那么在每个线程中对inc自增完之后在其他线程中都能看到修改后的值啊所以有10个线程分别进行了1000次操作那么最终inc的值应该是1000*1010000。前面我们讲到volatile是可以保证可见性的不过上述程序的错误在于volatile没法保证程序的原子性。有任何问题都可以随时关注私信
RELATED

相关推荐

MATLAB实现BiLSTM锂电池寿命预测实战指南

MATLAB实现BiLSTM锂电池寿命预测实战指南

1. 项目背景与核心价值锂电池剩余寿命(RUL)预测是工业预测性维护领域的关键技术,直接关系到设备安全性和使用成本。传统基于物理模型的方法需要精确的电池衰减机理知识,而数据驱动的深度学习方法正在成为更通用的解决方案。这个项…

📅 2026/9/15 6:54:14
数据安全防护与反爬虫技术实战解析

数据安全防护与反爬虫技术实战解析

1. 数据泄露的现状与爬虫的边界互联网每天产生约2.5万亿字节数据,其中约30%的企业数据会遭遇非授权访问。我在金融行业做数据安全审计时,曾亲历过某电商平台因爬虫攻击导致每日损失近百万的案例——攻击者仅用50台云服务器就爬走了全网商品价格数据。爬虫…

📅 2026/9/15 6:54:14
humanizer:构建人机信任的语义桥接层

humanizer:构建人机信任的语义桥接层

1. 项目概述:什么是 humanizer?它解决的不是“拟人化”,而是“可信度断层”最近在多个技术社区、设计团队协作群和产品需求评审会上,“humanizer”这个词出现频率陡增,常和“humanizer skill”连用,比如“这…

📅 2026/9/15 6:54:14
MORE NEWS

更多资讯

📰

Java 21 ZGC调优实战:把响应时间压到1ms以内

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

一文讲透数据治理8大核心模块:数据标准、质量、资产、目录、血缘……

很多企业做数据治理,最后都会陷入一种很奇怪的状态: 标准越来越多,数据却没有越来越统一; 平台越来越全,业务找数还是困难; 质量规则建了几百条,月底对账依然经常出问题。 原因往往不是企业…

📰

Word一键批量调整图片大小与对齐:表格、VBA宏实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

任务编号1.3背后:前端列表页开发的需求拆解与工程落地实践

1. 任务拆解与需求边界先对齐我看到“任务1.3”这个编号,第一反应是——这大概率是项目排期或看板里某个阶段任务包的子项。编号“1.3”通常是“第一阶段第三个任务”的意思,往往伴随着一条干巴巴的原始描述,比如“实现用户列表筛选与批量操作…

📰

凯基特行程开关选型与耐用性实战:避免产线停摆的关键细节

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

OCR-EDR:视觉引导的OCR纠错技术实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬