前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >volatile关键字解析

volatile关键字解析

原创
作者头像
矿泉水
发布2018-05-11 12:05:19
6461
发布2018-05-11 12:05:19
举报
文章被收录于专栏:风中追风风中追风

在给 volatile关键字解析 之前 希望看本文的朋友对Java内存模型有一定的了解;不了解的朋友可以先看看Java内存模型

一、volatile关键字有什么用呢?

1、保证了不同线程访问同一个变量时的可见性,也就是说A线程修改了一个变量的值,B线程C线程能马上就能看到这个变量的最新值。

2、禁止指令的重排序。

1、volatile关键字能保证可见性吗?

看一个简单的例子:

[java] view plain copy

  1. <span style="font-size:18px;">//线程1
  2. int i = 1;  
  3. i = 100;  
  4. //线程2
  5. int k = i ;</span>  

如果了解Java内存模型,相信你一定可以一眼看出,在多线程的情况下,线程1的是CPU1,执行线程2的是CPU2。由上面的分析可知,当线程1执行 i =100这句时,会先把i的初始值加载到CPU1的高速缓存中,然后赋值为100,那么在CPU1的高速缓存当中i的值变为100了,却没有立即写入到主存当中。此时线程2执行 k = i,它会先去主存读取i的值并加载到CPU2的缓存当中,注意此时内存当中i的值还是0,那么就会使得 k 的值为0,而不是100,如果加了volatile 呢?

加上了volatile,就相当于给访问 volatile 修饰变量的线程 一双火眼金睛~

线程1会把volatile修饰的这个变量的每一个操作后的值都告诉主存,其他线程任何时候都可以读取到最新最正确的值;

2、volatile关键字能保证有序性吗?

看一个简单的例子:

[java] view plain copy

  1. <span style="font-size:18px;">//线程1  
  2. resourse =  config.load(); //语句1:假设是加载一个文件完成初始化;  
  3. boolean flag = true;//语句2   
  4. //线程2  
  5. if(flag=false){    
  6.     Thread.sleep(1000);    
  7. }    
  8. add(<span style="font-family:Verdana, Arial, Helvetica, sans-serif;">resourse</span>);</span>  

Java内存模型中我们举过这个例子,在多线程的情况下:如果语句2先执行了,可能导致发生异常;如果给flag变量加上volatile 关键字,volatile关键字能保证在它之前的语句1执行了,才会执行它自己语句2;

再看一个单线程的例子:

[java] view plain copy

  1. <span style="font-size:18px;">a = 1;//语句1
  2. b = 2;//语句2
  3. volatile boolean flag = true;//语句3
  4. a = 4;//语句4
  5. b = 5;//语句5</span>

我们知道由于flag变量为volatile变量,那么在进行指令重排序的过程的时候,不会将语句3放到语句1、语句2前面,也不会讲语句3放到语句4、语句5后面。但是要注意语句1和语句2的顺序、语句4和语句5的顺序是不作任何保证的。

并且volatile关键字能保证,执行到语句3时,语句1和语句2必定是执行完毕了的,且语句1和语句2的执行结果对语句3、语句4、语句5是可见的。

3、volatile关键字能保证原子性吗?

volatile并不能保证一个操作是原子操作,为了让一个操作是原子操作可以使用synchronized关键字和Lock锁来实现;

二、volatile 使用场景

在多线程的情况下,需要进行读(获取)操作时可以使用volatile 关键字来修饰变量,在进行写操作时,还是需要使用synchronized关键字和Lock锁来实现。

举个简单的例子:concurrenthashmap 的 put 操作是要加锁才能保证把节点放进“桶”的时候是线程安全的,

而 get 操作是不需要加锁的,原因就是 节点 的属性 使用了volatile 关键字;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档