JUC系列01-volatile关键字

1 Volatile关键字正确使用demo

1 如果flag没有volatile关键字,则main中的while循环将无法正常推出循环
2 如果不使用volatile关键字,而在while循环方法中使用synchronized同步锁,也可刷新缓存,也能正常推出循环,但是多线程操作下效率就会变得很低了。

/**
 * volatile关键字
 * 1 线程之间可见性
 * 2 不保证操作的原子性
 */
public class TestVolatile {

    public static void main(String[] args) {
        ThreadDemo threadDemo = new ThreadDemo();
        new Thread(threadDemo).start();
        while (true) {
            if (threadDemo.isFlag()) {
                System.out.println("flag变更为true,结束循环");
                break;
            }
        }
    }
}

class ThreadDemo implements Runnable {

    private volatile boolean flag = false;

    @Override
    public void run() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = true;
        System.out.println("flag变更为true");
    }

    public boolean isFlag() {
        return flag;
    }
}

2 Volatile内存可见性

1 内存可见性定义:当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够立即看到发生的状态变化。
2 JVM内存模型:主内存和线程独立的工作内存。每个线程会在自己的工作内存来操作共享变量,操作的只是工作内存中的副本,其它线程也有一份副本,是互不可见的。而volatile关键字可以理解为所有线程读取和操作的都是主内存,所以是可见的。

来源:码蜂窝-JUC系列01-volatile关键字

你可能感兴趣的:(JUC系列01-volatile关键字)