天天看點

【硬剛Java并發】JUC基礎(一):volatile 關鍵字 記憶體可見性

本文是對《【硬剛大資料之學習路線篇】從零到大資料專家的學習指南(全面更新版)》的Java并發部分補充。

記憶體可見性(Memory Visibility)是指當某個線程正在使用對象狀态而另一個線程在同時修改該狀态,需要確定當一個線程修改了對象狀态後,其他線程能夠看到發生的狀态變化。

可見性錯誤是指當讀操作與寫操作在不同的線程中執行時,我們無法確定執行讀操作的線程能适時地看到其他線程寫入的值,有時甚至是根本不可能的事情。

我們可以通過同步來保證對象被安全地釋出。除此之外我們也可以使用一種更加輕量級的 volatile 變量。

volatile 關鍵字

  • 對于多線程,不是一種互斥關系
  • 不能保證變量狀态的“原子性操作”
package com.atguigu.juc;

/*
 * 一、volatile 關鍵字:當多個線程進行操作共享資料時,可以保證記憶體中的資料可見。
 *                       相較于 synchronized 是一種較為輕量級的同步政策。
 * 
 * 注意:
 * 1. volatile 不具備“互斥性”
 * 2. volatile 不能保證變量的“原子性”
 */
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) {
        }

        flag = true;

        System.out.println("flag=" + isFlag());

    }

    public boolean isFlag() {
        return flag;
    }

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

}