java7与java8在内存可见性上使用volatile处理不一致
作者:互联网
话不多说,使用jdk1.8
package com.pccc.pactera.juc01;
/**
* 关键字 Volatile
* @author zhao
*
*/
public class TestVolatile {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while(true){
if(td.isFlag()) {
System.out.println("--------");
break;
}
}
}
}
class ThreadDemo implements Runnable{
private volatile boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
System.out.println("flag="+isFlag());
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
执行上边代码,打印信息:
--------
flag=true
当删除volatile关键字,即不使用volatile或synchronized时
private boolean flag = false;
,打印信息:
flag=true
--------
切换到jdk1.7时,线程得可见性问题完全看不到效果,不管用关键字volatile或synchronized时,都打印
flag=true
--------
总结:关键字volatile在jdk1.8与之前版本处理是不一致,避免栽坑。
标签:java7,public,关键字,flag,boolean,volatile,true,java8 来源: https://blog.csdn.net/woailuo23/article/details/97496100