juc之volatile关键字

  1. volatile关键字作用
    可以确保将变量的更新操作通知到其他线程,保证变量在内存中是可见的,每次读取到的值都是最新写入的。类似一种轻量级的锁,与锁的不同之处在于读取volatile修饰的变量时不会加锁,不会造成线程阻塞。
    volatile不具有的功能:
    a.volatile不能保证变量的“原子性操作”
    b. 对于多线程不具有互斥性
    例子如下:
public class VolatileTest extends Thread {
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        new Thread(td).start();
        while (true) {
// synchronized (td) {
                if (td.isFlag()) {
                    System.out.println("------------------");
                    break;
                }
// }
        }
    }
}
class ThreadDemo implements Runnable {
    private boolean flag=false;
// private volatile boolean flag = false;

    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
        }
        flag = true;
        System.out.println("flag=" + isFlag());

    }
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

}

程序运行结果:
《juc之volatile关键字》
造成的原因是:多个线程操作共享数据,彼此不可见
2.解决方式
a.使用synchronized同步锁
b.使用volatile关键字修饰变量
3.使用场景
a.对变量的写操作不依赖于当前值
b.该变量没有包含在具有其他变量的不变式中

    原文作者:JUC
    原文地址: https://blog.csdn.net/DoMoreO/article/details/82081789
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞