一、內存可見性
1、內存可見性(Memory Visibility)
指當某個線程正在使用對象狀態 而另一個線程在同時修改該狀態,需要確保當一個線程修改了對象 狀態後,其他線程能夠看到發生的狀態變化。
2、可見性錯誤
指當讀操作與寫操作在不同的線程中執行時,我們無 法確保執行讀操作的線程能適時地看到其他線程寫入的值,有時甚 至是根本不可能的事情。
3、解決方法
- 通過同步加鎖來保證對象被安全地修改。但是影響性能。
- 使用一種輕量級的 volatile 變量,但是不具備"互斥性"、不能保證變量的原子性。
4、代碼案例
package com.example.juc;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* @author haoxiansheng
* 1、先不加volatile 關鍵字 看運行效果
* 2、解決方法: 加鎖、volatile關鍵字
*/
@Slf4j
public class VolatileTest {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while (true) {
// 不佳鎖
if (td.isFlag()) {
log.info("==================>");
break;
}
// 加鎖 效率低
// synchronized (td) {
// if (td.isFlag()) {
// log.info("==================>");
// break;
// }
// }
}
}
}
@Data
@Slf4j
class ThreadDemo implements Runnable {
// volatile
// private volatile boolean flag = false;
private boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
flag = true;
log.info("flag=>{}", isFlag());
}
}
5、圖片