java7与java8在内存可见性上使用volatile处理不一致教程
话不多说,使用jdk1.8
<pre class="has">
package com.pccc.pactera.juc01;
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与之前版本处理是不一致,避免栽坑。