日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

使用volatile保證多線程之間實例變量的可見性

作者:CAUC_lin 更新時間: 2022-08-15 編程語言

可見性–線程工作內存造成的異常情況

1.使用多線程造成的死循環情況

代碼實例:

//測試可見性
public class RunThread extends Thread{

    private boolean isRunning = true;

    public boolean isRunning(){
        return isRunning;
    }

    public void setRunning(boolean isRunning){
        this.isRunning = isRunning;
    }

    @Override
    public void run() {
        System.out.println("進入run了");
        while (isRunning == true){
        }
        System.out.println("線程被停止了!");
    }
}

	//測試
    public static void main(String[] args) {
        try {
            RunThread thread = new RunThread();
            thread.start();
            Thread.sleep(1000);
            thread.setRunning(false);
            System.out.println("已經賦值為false了");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


執行結果出現了死循環情況

輸出結果:
在這里插入圖片描述

為什么會出現這種情況?怎么解決?

  1. 出現死循環的原因

    程序陷入空循環,主要是由于isRunning變量存在于公共堆棧和線程的私有堆棧,線程運行后,一直在私有堆棧中獲取變量值,而代碼的"thread.setRunning(false);"更新的是公共堆棧中的值,所以程序處于死循環中。

線程私有的內存結構:
在這里插入圖片描述

  1. 解決辦法

    使用volatile關鍵字,當變量使用volatile時,會直接從主內存中獲取變量,從而使操作的為同一變量,程序即可正常退出。

    private volatile boolean isRunning = true;

volatile操作的結構圖:
在這里插入圖片描述

總結:

  1. 線程間可見性是指:線程不從工作內存獲取,直接從主內存獲取值。
  2. 通過使用volatile關鍵字可以增加實例變量在多個線程間的可見性。

原文鏈接:https://blog.csdn.net/CAUC_lin/article/details/125338387

欄目分類
最近更新