虽然已经工作了半年了...虽然一直是在做web开发....但是平时一直很少使用多线程.....

然后最近一直在看相关知识..所以就有了这篇文章

用例子来说明问题吧

 public class VolatileTest {
boolean b = false;
int a = 0; public static void main(String[] args) {
for (int i=0; i<1000000; i++) {
VolatileTest resource = new VolatileTest();
Thread t1 = new Thread(new A(resource));
Thread t2 = new Thread(new B(resource));
t1.start();
t2.start();
//System.out.println(i);
}
}
} class A implements Runnable {
VolatileTest r = null; public A(VolatileTest a) {
r = a;
} public void run() {
r.a = 1;
r.b = true;
} } class B implements Runnable {
VolatileTest r = null; public B(VolatileTest a) {
r = a;
} public void run() {
while (!r.b) {
Thread.yield();
}
int temp = r.a;
if (temp == 0) {
System.out.println("出现CPU指令重排");
}
}
}

在这个例子中我总共输出了11次出现CPU指令重排

之所以会有这个输出,是因为虽然在A类里代码是先将r.a设置为1,再修改r.b为true.(Line:25,26)但是在CPU执行的时候仍然可能会先做第26行代码,再做25行代码..因为这2行代码之间没有什么关联.所以优化的时候可能会改变顺序.这样就导致了会输出出现CPU指令重排

如果将VolatileTest 的b属性增加volatile关键字的话就不会有这个情况.它可以保证这个对象前面的操作与后面的操作的顺序不会相互调换.相当于把原本代码分成了2段(A类的run方法中25行之前的代码是一段,25行之后的代码是一段,只是这里run里的代码比较少),前后2段代码顺序不会调换,但是这2段代码自己内部之间的顺序还是可以调换的.

这种问题在单线程下是不会出现的,因为如果前后2句代码之间有关联,那么CPU会保证前一句代码先于后一句代码执行.但是在多线程里得不到保证. 所以才需要volatile关键字

我现在对volatile的理解就是它像是synchronized的弱化版本.它可以阻止一些情况下的并发问题,但是另外一些情况的并发问题是阻止不了的.(后面会写哪些情况可以哪些不可以)

volatile关键字 学习记录1的更多相关文章

  1. volatile关键字 学习记录2

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

  2. volatile关键字学习

    volatile关键字在实际工作中我用的比较少,可能因为我并不是造轮子的.但是用的少不是你不掌握的借口,还是要创造场景去使用这个关键字,本文将会提供丰富的demo. volatile 发音:英[ˈvɒ ...

  3. C++——volatile关键字的学习

    首先声明一点,本文是关于volatile关键字的学习,学习内容主要是来自一些大牛的网络博客. 一篇是何登成先生的C/C++ Volatile关键词深度剖析(http://hedengcheng.com ...

  4. JAVA多线程基础学习三:volatile关键字

    Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...

  5. Java多线程学习(三)volatile关键字

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  6. JAVA多线程学习- 三:volatile关键字

    Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...

  7. Thread 学习记录 <1> -- volatile和synchronized

    恐怕比较一下volatile和synchronized的不同是最容易解释清楚的.volatile是变量修饰符,而synchronized则作用于一段代码或方法:看如下三句get代码: int i1;  ...

  8. Java并发编程学习笔记 深入理解volatile关键字的作用

    引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...

  9. C语言学习及应用笔记之四:C语言volatile关键字及其使用

    在C语言中,还有一个并不经常使用但却非常有用的关键字volatile.那么使用volatile关键字究竟能干什么呢?接下来我将就此问题进行讨论. 一个使用volatile关键字定义变量,其实就是告诉编 ...

随机推荐

  1. 表单元素——checkbox样式美化

    一.背景 设计狮童鞋总是会设计各种高大上的效果图,比如下面这个土豪金的效果. 该图中“已阅读并同意相关服务条款”前面的复选框有一个金色的边框,打钩时是一个金色的对勾.接下来说说怎样实现该效果. 二.解 ...

  2. MongoDB查询转对象是出错Element '_id' does not match any field or property of class

    MongoDB查询转对象是出错Element '_id' does not match any field or property of class   解决方法: 1.在实体类加:[BsonIgno ...

  3. [LeetCode] Word Ladder 词语阶梯

    Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...

  4. 创业日志N,一听到别人说创业我就怕

    最近总有些朋友想创业,咨询我的意见. 一般是在公司干腻了,有个想法,想出来试试水.还有是觉得自己的idea太棒了,想试试. 相同的是两者都有点怕.听说最近创业环境不好,没有投资!有个朋友推荐的创业者, ...

  5. [Python基础知识]正则

    import re str4 = r"^http://qy.chinahr.com/cvm/preview\?cvid=\w{24,25}&from=sou&gtid=\w{ ...

  6. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  7. 动态生成验证码———MVC版

    上面有篇博客也是写的验证码,但那个是适用于asp.net网站的. 今天想在MVC中实现验证码功能,弄了好久,最后还是看博友文章解决的,感谢那位博友. 首先引入生成验证码帮助类. ValidateCod ...

  8. IFC是什么

    IFC是用EXPRESS语言来描述的一种数据格式 IFC的物理文件 为了数据交换的目的,STEP标准Prat 21规定了正文文件的结构,认为一个STEP文件或一个Part 21文件包括两端:头段和数据 ...

  9. vue.js第六课

    class与style绑定 绑定HTML class 对象语法 数组语法 绑定内联样式 对象语法 数组语法 自动添加前缀 1.class与style绑定. 数据绑定一个常见需求就是 操作元素的clas ...

  10. CocoaPods的那些坑

    CocoaPods的那些坑 文章转自http://blog.csdn.net/zhanniuniu/article/details/52159362#comments 我跟博主的经历超级像!不过自己用 ...