全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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 关键字时,我们必须注意以下几点:

  1. volatile 关键字并不能消除原子之间的同步操作的需要,因为内存一致性错误仍然是可能的
  2. 使用原子变量比使用 synchronized 同步代码更有效率,但是为了避免内存一致性错误,需要作出额外的努力
  3. volatile 关键字不能替代 synchronized 同步代码块和方法

以上就是关于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小时内与您取得联系。