多线程学习—2-volatile的使用

前言

​ 今天继续学习多线程,本来volatile关键字应该很好理解,不需要单独写博客记录。但是今天碰到些我暂时不能解释的问题,固贴出来交流一下。

volatile

​ 根据JMM,Java中有一块主内存,不同的线程有自己的工作内存,同一个变量值在主内存中有一份,如果线程用到了这个变量的话,自己的工作内存中有一份一模一样的拷贝。每次进入线程从主内存中拿到变量值,每次执行完线程将变量从工作内存同步回主内存中。

​ 被volatile修饰的变量,保证了每次读取到的都是最新的那个值。线程安全围绕的是可见性原子性这两个特性展开的,volatile解决的是变量在多个线程之间的可见性,但是无法保证原子性。如下面代码所示,进入while循环时,如果不加volatile关键字,注释掉System.out.println(“running”);这行代码,程序是跳不出循环的,但是加上volatile关键字就能跳出了,这证明了volatile解决的是变量在多个线程之间的可见性。可是奇怪的是我将System.out.println(“running”);取消注释,即使不加上volatile也能跳出循环,还望明白的交流解释。我的测试环境是jdk 1.8

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package MyThread;
/**
* Created by yuhang on 2016/12/1.
*/
public class MyThread3 extends Thread {
// volatile
int a = 1;
@Override
public void run() {
System.out.println("a: " + a);
while (a == 1) {
// System.out.println("running");
}
System.out.println("while loop end");
}
public static void main(String[] args) {
MyThread3 myThread3 = new MyThread3();
myThread3.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myThread3.a = 2;
}
}
坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章