全网整合营销服务商

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

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

Java多线程并发编程 Volatile关键字

volatile 关键字是一个神秘的关键字,也许在 J2EE 上的 JAVA 程序员会了解多一点,但在 Android 上的 JAVA 程序员大多不了解这个关键字。只要稍了解不当就好容易导致一些并发上的错误发生,例如好多人把 volatile 理解成变量的锁。(并不是)

volatile 的特性:

具备可见性

保证不同线程对被 volatile 修饰的变量的可见性。

有一被 volatile 修饰的变量 i,在一个线程中修改了此变量 i,对于其他线程来说 i 的修改是立即可见的。

如:

volatile int i = 0;// 语句 1
i++; // 语句 2

语句 2 执行完后,i 最新的值会立即被强制更新到主内存(共享内存),并通知其他缓存了 i 的线程,令其他线程的工作内存里的 i 失效,从而需重新到主内存读取最新的值。

具备有序性

被 volatile 修饰的变量,不会被优化排序。

解决的问题详见:Java 多线程并发编程 并发三大要素 的 三、有序性。

当编译器在给程序优化排序时,若遇到 volatile 变量的读操作或者写操作,则会保证在其前面的操作全部进行完成,且结果对后面的操作可见;并且保证在其后面的操作没有进行。

不具备原子性

volatile 不具备原子性,所以它是线程不安全的。

实验:

// 一个单例的实现
public class SingletonTest {

  private static volatile SingletonTest mInstance = null;

  private SingletonTest() {}

  public static SingletonTest getInstance() {

    if (mInstance == null) {
      mInstance = new SingletonTest();
      System.out.println(" 初始化完成 ");
    }

    return mInstance;
  }
}


// 测试代码
public class Test {

  public static void main(String[] var0) {
    for(int i = 0; i < 20; i++){
      ThreadTest test = new ThreadTest();
      test.start();
    }
  }

  static class ThreadTest extends Thread{

    @Override
    public void run() {
      super.run();

      SingletonTest.getInstance();
    }
  }

}

结果:
每次运行都输出多个 “初始化完成”。

volatile 的解释

下面这段话摘自《深入理解 Java 虚拟机》:

“观察加入 volatile 关键字和没有加入 volatile 关键字时所生成的汇编代码发现,加入 volatile 关键字时,会多出一个 lock 前缀指令”

被 volatile 修饰的变量进行读和写操作的时候,在相应的汇编程序中都会多一句内存屏障(Memory Barrier)。

而这个 lock 就是内存屏障。

内存屏障的作用:

1、在重新优化排序时保证其后面的指令不会被排到内存屏障的前面,前面的指令也不会排到内存屏障的后面。- 有序性

2、强制对写操作后的结果(立即)刷新到主内存。

3、刷新结果到主内存时,通知并令其他线程缓存内的值过期 / 失效。

2 和 3 合起来则是可见性。

说到这里,也许会有好多人困惑,既然可见性可以保证,既然可以做到修改某个变量的值后,会刷新到主内存,并令其他线程缓存失效,为什么不能保证原子性呢?这也是我之前走进的一个困区。

继续用 i++ 来分析一下,这里面包含的指令:

从主内存读取到缓存 // 指令 1
进行运算 // 指令 2
从缓存刷新到主内存 // 指令 3
内存屏障 // 指令 4

虽然指令 4(内存屏障)功能强大,但可惜 // 指令 1、2、3 都不是具备原子性,所以导致 volatile 不具备原子性,线程不安全,不能替代锁的作用。

使用场景

如一些简单的状态标记:

volatile boolean inited = false;

// 线程 1
init(); // 语句 1
inited = true; // 语句 2

// 线程 2
while(inited){
	work(); // 语句 3
}

1、可确保语句 1 和语句 2 的执行顺序。
2、可确保执行语句 2 后,线程 2 可立即获取到最新的修改,从而执行语句 3。


# Java  # Volatile  # 关键字  # Java并发编程之常用的多线程实现方式分析  # Java多线程并发编程和锁原理解析  # 深入理解Java多线程与并发编程  # Java多线程并发编程(互斥锁Reentrant Lock)  # Java多线程之并发编程的核心AQS详解  # 不具备  # 见性  # 不安全  # 新到  # 是一个  # 汇编程序  # 有一  # 会有  # 一句  # 多个  # 则是  # 就好  # 但在  # 三大  # 说到  # 它是  # 不了解  # 这里面  # 多出  # 则会 


相关文章: 建站之星安装失败:服务器环境不兼容?  如何在云主机快速搭建网站站点?  个人摄影网站制作流程,摄影爱好者都去什么网站?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  网站制作员失业,怎样查看自己网站的注册者?  如何有效防御Web建站篡改攻击?  如何快速登录WAP自助建站平台?  如何制作算命网站,怎么注册算命网站?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  动图在线制作网站有哪些,滑动动图图集怎么做?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  建站之星在线版空间:自助建站+智能模板一键生成方案  制作宣传网站的软件,小红书可以宣传网站吗?  建站之星CMS五站合一模板配置与SEO优化指南  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  学校为何禁止电信移动建设网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  高防服务器:AI智能防御DDoS攻击与数据安全保障  网站图片在线制作软件,怎么在图片上做链接?  表情包在线制作网站免费,表情包怎么弄?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  建站之星如何助力企业快速打造五合一网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  html制作网站的步骤有哪些,iapp如何添加网页?  如何在万网ECS上快速搭建专属网站?  高端建站如何打造兼具美学与转化的品牌官网?  制作网站的模板软件,网站怎么建设?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  建站主机功能解析:服务器选择与快速搭建指南  简历在线制作网站免费,免费下载个人简历的网站是哪些?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  大学网站设计制作软件有哪些,如何将网站制作成自己app?  建站之星如何保障用户数据免受黑客入侵?  如何正确下载安装西数主机建站助手?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何用低价快速搭建高质量网站?  网站制作服务平台,有什么网站可以发布本地服务信息?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  行程制作网站有哪些,第三方机票电子行程单怎么开?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  建站之星2.7模板:企业网站建设与h5定制设计专题  建站VPS配置与SEO优化指南:关键词排名提升策略  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  学校建站服务器如何选型才能满足性能需求? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。