/**
* volatile 关键字:内存可见性问题是,当多个线程操作共享数据时,可以保证数据在内存中是可见的
* 相较于synchronized是一种较为轻量的同步策略
*
* 注意:
* volatile 不具备互斥性,比如本例中的flag可以被多个线程访问(synchronized有互斥性,同时只能有一个线程访问flag)
* volatile 不能保证变量的原子性
*/
public class TestVolatile {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
//如果共享数据不加volatile关键字,两个线程在操作共享数据就互相不可见
while (true) {
/*
如果不给flag添加volatile关键词让其线程可见,
可以给获取方法处加同步synchronized锁不停去刷新获取数据,但是效率低下,不建议使用
synchronized (td){
if(td.isFlag()){
System.out.println("----------------");
break;
}
}
*/
if(td.isFlag()){
System.out.println("----------------");
break;
}
}
}
}
class ThreadDemo implements Runnable{
//如果加了volatile相当于两个线程都是从主存去获取共享数据
//private volatile boolean flag = false;
private volatile boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(1000);
} 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;
}
}