话不多说,使用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与之前版本处理是不一致,避免栽坑。

标签: flag, boolean, volatile, 关键字, java7, java8

相关文章推荐

添加新评论,含*的栏目为必填