java volatile关键字使用方法及注意事项

什么是volatile关键字
volatile 关键字在多线程程序中起着很重要的作用。当多个线程操作同一个变量时,每个线程将拥有对那个变量的本地缓存拷贝,因此,当某一个线程修改了这个变量的值时,实际上修改的是它本地缓存中的变量值,而不是主内存中的变量值,操作这个变量的其他线程并不知道这个变量的值被改变了。为了避免这种情况,我们可以用 valatile 关键字声明这个变量,用 valatile 声明了这个变量之后,变量将不在本地缓存中保存,而在主内存中保存,当有线程修改了它的值以后,它的更新值将被更新到主内存当中,随后,其他线程也能访问更新后的值。当一个变量被声明为 volatile 后,java 内存模型确保所有使用该变量的线程能看到相同的、一致的值。
volatile关键字使用
首先,创建 VolatileData 类,代码如下:
public class VolatileData {
//声明为volatile类型
private volatile int counter = 0;
/**
* 返回counter变量的值
* @return
*/
public int getCounter() {
return counter;
}
/**
* 自增counter变量的值
*/
public void increaseCounter() {
++counter;
}
}
接下来创建 VolatileThread 类,代码如下:
public class VolatileThread extends Thread {
private final VolatileData volatileData;
public VolatileThread(VolatileData volatileData) {
this.volatileData = volatileData;
}
/**
* 调用VolatileData类中的两个方法,进行取值和自增操作
*/
@Override
public void run() {
int oldValue = volatileData.getCounter();
System.out.println("[Thread " + Thread.currentThread().getId() + "]: Old value = " + oldValue);
volatileData.increaseCounter();
int newValue = volatileData.getCounter();
System.out.println("[Thread " + Thread.currentThread().getId() + "]: New value = " + newValue);
}
}
最后,创建 VolatileMain 类,对以上程序进行测试,代码如下:
public class VolatileMain {
private final static int TOTAL_THREADS = 2;
public static void main(String[] args) throws InterruptedException {
VolatileData volatileData = new VolatileData();
Thread[] threads = new Thread[TOTAL_THREADS];
for(int i = 0; i < TOTAL_THREADS; ++i)
threads[i] = new VolatileThread(volatileData);
//开始读取变量值的操作
for(int i = 0; i < TOTAL_THREADS; ++i)
threads[i].start();
//等待所有线程操作终止
for(int i = 0; i < TOTAL_THREADS; ++i)
threads[i].join();
}
}
在 VolatileMain 类中,使用了两个线程来访问 volatile 变量,输出如下:
[Thread 10]: Old value = 0 [Thread 11]: Old value = 0 [Thread 10]: New value = 1 [Thread 11]: New value = 2
从输出可以看到,首先,两个线程都输出了相同的值,接着,在 increaseCounter 方法被调用之后,两个线程都访问和输出了最新的 volatile 变量的值。
happens-before 关系
在使用 volatile 关键字时,不得不提一下 java 内存模型的 happens-before 关系。happens-before 关系是 java 内存模型的一个重要方面。它建立在两个不同的事件之间,使第一个事件对对象的所有改变都可以被第二个事件看到和反映出。比如当一个线程对 volatile 变量进行写操作后,另一个线程随后访问该变量,happens-before 关系就建立了。因此,所有对 volatile 变量的改变对其他线程来说是可见的。
需要注意的
当在程序中使用 volatile 关键字时,我们必须注意以下几点:
以上就是关于java volatile关键字的使用方法,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# volatile关键字使用总结
# java
# volatile的使用
# 深入解析Java中volatile关键字的作用
# Java中volatile关键字的作用与用法详解
# Java中Volatile关键字详解及代码示例
# Java中volatile关键字实现原理
# java多线程编程之慎重使用volatile关键字
# 谈谈Java中Volatile关键字的理解
# 详解Java面试官最爱问的volatile关键字
# 详解Java线程编程中的volatile关键字的作用
# Java里volatile关键字是什么意思
# Java中volatile关键字的作用是什么举例详解
# 变量值
# 为了避免
# 类中
# 的是
# 第一个
# 多个
# 如有
# 也能
# 可以用
# 而在
# 希望能
# 第二个
# 更有
# 很重要
# 可以看到
# 将被
# 这种情况
# 几点
# 仍然是
# 并不能
相关文章:
宿州网站制作公司兴策,安徽省低保查询网站?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
建站之星ASP如何实现CMS高效搭建与安全管理?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
,制作一个手机app网站要多少钱?
制作旅游网站html,怎样注册旅游网站?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
西安专业网站制作公司有哪些,陕西省建行官方网站?
制作门户网站的参考文献在哪,小说网站怎么建立?
建站之星上传入口如何快速找到?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
宝塔Windows建站如何避免显示默认IIS页面?
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何在云主机快速搭建网站站点?
建站ABC备案流程中有哪些关键注意事项?
公司网站制作价格怎么算,公司办个官网需要多少钱?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
简历在线制作网站免费版,如何创建个人简历?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站之星备案是否影响网站上线时间?
制作网站的软件免费下载,免费制作app哪个平台好?
C#如何序列化对象为XML XmlSerializer用法
常州企业建站如何选择最佳模板?
代购小票制作网站有哪些,购物小票的简要说明?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
c# await 一个已经完成的Task会发生什么
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
建站之星云端配置指南:模板选择与SEO优化一键生成
建站之星多图banner生成与模板自定义指南
如何用PHP快速搭建CMS系统?
文字头像制作网站推荐软件,醒图能自动配文字吗?
制作销售网站教学视频,销售网站有哪些?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何在Golang中指定模块版本_使用go.mod控制版本号
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
制作网站的模板软件,网站怎么建设?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
建站之星免费模板:自助建站系统与智能响应式一键生成
宝塔新建站点为何无法访问?如何排查?
完全自定义免费建站平台:主题模板在线生成一站式服务
电商平台网站制作流程,电商网站如何制作?
如何续费美橙建站之星域名及服务?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。