本文是對《【硬剛大資料之學習路線篇】從零到大資料專家的學習指南(全面更新版)》的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;
}
}