【JUC】 01-volatile 關鍵字 內存可見性

一、內存可見性

1、內存可見性(Memory Visibility)

指當某個線程正在使用對象狀態 而另一個線程在同時修改該狀態,需要確保當一個線程修改了對象 狀態後,其他線程能夠看到發生的狀態變化。

2、可見性錯誤

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

3、解決方法

  1. 通過同步加鎖來保證對象被安全地修改。但是影響性能。
  1. 使用一種輕量級的 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、圖片

線程一
工作內存
主存
線程二
工作內存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章