千家信息网

如何学习Java volatile关键字

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,今天就跟大家聊聊有关如何学习Java volatile关键字,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。相信大多数Java程序员都学习过vo
千家信息网最后更新 2026年11月04日如何学习Java volatile关键字

今天就跟大家聊聊有关如何学习Java volatile关键字,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

相信大多数Java程序员都学习过volatile这个关键字的用法。百度百科上对volatile的定义:

volatile是一个类型修饰符(type specifier),被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

可能有很多刚学Java的朋友们看了上面这段非常笼统的描述后仍然觉得云里雾里的。

下面我们就用一个具体的例子来学习volatile的用法。

看这个例子:

public class ThreadVerify {    public static Boolean stop = false;    public static void main(String args[]) throws InterruptedException {        Thread testThread = new Thread(){            @Override            public void run(){                int i = 1;                while(!stop){                    //System.out.println("in thread: " + Thread.currentThread() + " i: " + i);                    i++;                }                System.out.println("Thread stop i="+ i);            }        }        ;        testThread.start();        Thread.sleep(1000);        stop = true;        System.out.println("now, in main thread stop is: " + stop);        testThread.join();    }}

这段代码在主线程的第二行定义了一个布尔变量stop, 然后主线程启动一个新线程,在线程里不停得增加计数器i的值,直到主线程的布尔变量stop被主线程置为true才结束循环。

主线程用Thread.sleep停顿1秒后将布尔值stop置为true。

因此,我们期望的结果是,上述Java代码执行1秒钟后停止,并且打印出1秒钟内计数器i的实际值。

然而,执行这个Java应用后,你发现它进入了死循环,在任务管理器里发现这个Java程序CPU占用率飙升。

原因是什么呢?让我们温习下计算机专业课操作系统中讲过的内存模型的知识。

以Java内存模型为例,Java内存模型分为主内存(main memory)和工作内存(work memory)。主内存内的变量由所有线程共享,每个线程拥有自己的工作内存,里面的变量包含了线程局部变量。主内存中的变量如果被线程使用到,则线程的工作内存会维护一份主内存变量的副本拷贝。

线程对变量的所有读写操作必须在工作内存中进行,不能直接操作主内存中的变量。不同线程之间也无法直接访问对方的工作内存。线程间变量的传递需通过主内存来完成。线程、主内存、工作内存三者之间的交互关系如下图:

如果线程在自己的执行代码里修改了定义在主线程(主内存)中的变量,修改直接发生在线程的工作内存里,然后在某个时刻(Java程序员无法控制这个时刻,而是由JVM调度的),这个修改从工作内存写回到主内存。

回到我们的例子。尽管主线程修改了stop变量,但是仅仅修改了主内存中的值,而操作计数器的线程的工作内存里的stop变量还是旧的值,始终为false。因此这个线程陷入了死循环。

知道了原理,解决方案就很简单了。在stop变量前加上关键字volatile进行修饰,这样在计数器线程里每次读取stop的值时,volatile会强制该线程从主内存读取,而不是从当前线程的工作内存读取。这样就避免了死循环。下图显示1秒钟之后,计数器执行了14亿次。

看完上述内容,你们对如何学习Java volatile关键字有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

线程 内存 变量 工作 关键 关键字 计数器 学习 循环 代码 例子 内容 布尔 模型 程序 不同 指令 时刻 知识 程序员 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海卓越科技互联网 广州紫鲸互联网科技有限公司 云之行互联网科技 西安纸贵互联网科技有限公司 中国互联网科技工作委员会毛军 中国互联网科技股 互联网科技垄断 互联网金融 科技 北京互联网络科技有限公司 老年人脱离互联网科技的作文 须眉科技是互联网公司吗 互联网科技与管理 畅思互联网科技 科技赋能视角下互联网保险发展 合肥互联网科技公司公章图片 高科技互联网套路 珠海东科互联网科技有限公司 萌小萌互联网科技河南有限公司 中国科技和美国互联网 三亚科技创新互联网基地 衡水科技产业互联网平台 福州新华互联网科技学校 知乎 字节跳动和互联网科技 来此购互联网科技有限公司 苏州五指互联网络科技有限 如何创新互联网科技 威龙国际互联网科技公司 保险科技服务互联网营销体系 沐思想互联网科技有限公司 网互联网络科技
0