Java 提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。可以将 volatile 看做一个轻量级的锁,但是又与锁有些不同:

1. 对于多线程,不是一种互斥关系

2. 不能保证变量状态的“原子性操作”

在没有用volatile关键字修饰的demo

/**
* Volatile 关键字:当多线程操作共享数据时,可以保证内存数据的可见性,
* 相较于synchronized来说是一种比较轻量级的同步策略。
* 注意:
* 1. Volatile不能保证变量的原子性。
* 2. 不具备互斥性
* Created by 吴海飞 on 2017-1-23.
*/
public class TestVolatile {
public static void main(String[] args){
volatileDemo volatileDemo = new volatileDemo();
new Thread(volatileDemo).start(); while (true){
if(volatileDemo.isFlag()){
System.out.println("------------------");
break;
}
} }
} class volatileDemo implements Runnable{ private boolean flag = false; @Override
public void run() { try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
flag = true;
System.out.println("flag=" + isFlag());
}
public boolean isFlag() {
return flag;
} public void setFlag(boolean flag) {
this.flag = flag;
} }
  • 代码运行后会出现这种状况如下图所示:

  • 出现这种状况的原因是:

    主线程与子线程并发执行,在子线程拿到flag=false的同时,主线程也拿到了flag=false,之后子线程将flag变为true,并打印出flag,结束线程。主线程因为读取到的flag = false,所以一直处于死循环状态中无法结束线程任务。

  • 具体分析如下图所示:

  • 将flag变量设置成 volatile的,这样问题就解决了。

    当子线程将flag关键字改变时,将flag从子线程的缓冲区写入到内存中,这样主线程读到的flag变成true了,所以问题就解决了。

volatile关键字小结的更多相关文章

  1. Java volatile关键字小结

    public class Test { public static void main(String[] args){ } } /* 12.3 Java内存模型 Java内存模型定义了线程与主内存之间 ...

  2. Java 并发:volatile 关键字解析

    摘要: 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保 ...

  3. Java面试官最爱问的volatile关键字

    在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...

  4. 多线程中volatile关键字的作用

    原文链接:https://blog.csdn.net/xuwentao37x/article/details/27804169 多线程的程序是出了名的难编写.难验证.难调试.难维护,这通常是件苦差事. ...

  5. java并发系列(六)-----Java并发:volatile关键字解析

    在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保证可见性 ...

  6. Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  7. volatile关键字 学习记录2

    public class VolatileTest2 implements Runnable{ volatile int resource = 0; public static void main(S ...

  8. volatile关键字 学习记录1

    虽然已经工作了半年了...虽然一直是在做web开发....但是平时一直很少使用多线程..... 然后最近一直在看相关知识..所以就有了这篇文章 用例子来说明问题吧 public class Volat ...

  9. 【转】Java并发编程:volatile关键字解析

    转自:http://www.importnew.com/18126.html#comment-487304 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备 ...

随机推荐

  1. bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...

  2. Azure ASM到ARM迁移 (三) Reserved IP的迁移

    Azure的ASM下,很多用户的应用种域名的解析在DNS服务器种都采用A记录的方式,所以很多用户都在Azure上采用了Reserved IP. 关于Reserved IP,可以参考http://www ...

  3. Extjs5.0 学习之路【资源篇】

    磨刀不误砍柴工. 先收集资源,然后再开始学习之路. Extjs5.0 文件下载 API-5.0 API离线包 http://cdn.sencha.com/downloads/docs/ext-docs ...

  4. POJ2456(最大化最小值)

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10728   Accepted: 5288 ...

  5. [转载]网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、VXLAN

    offload 现在,越来越多的网卡设备支持 offload 特性,来提升网络收/发性能.offload 是将本来该操作系统进行的一些数据包处理(如分片.重组等)放到网卡硬件中去做,降低系统 CPU ...

  6. Java-API-Package:org.springframework.stereotype

    ylbtech-Java-API-Package:org.springframework.stereotype 1.返回顶部 1. @NonNullApi @NonNullFields Package ...

  7. idea debug的时候 启动起来超级慢

  8. JCTF 2014(Misc)

    小试身手: 点击下载附件 res/raw/hehe,打开 得到flag

  9. 实验吧CTF题库-密码学(部分)

    这里没有key: 打开链接,有一个弹窗 然后就是一个空白网页,右键查看源代码 这里有一串js密文,解密一下,https://www.dheart.net/decode/index.php 得到flag ...

  10. mysql 打印随机数

    select rand(); 这样取出来的数据是类似这样的: 0.5389902438400223 要几位自己取几位: 取得方法类似 select substr(concat("000000 ...