volatile关键字

/**
 * 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;
    }
}

发表评论

邮箱地址不会被公开。 必填项已用*标注