Java系列課----高性能編程專題----線程封閉

概念

多線程訪問共享可變數據時,涉及到線程安全,線程間數據同步的問題。並不是所有時候,都要用到共享數據,所以線程封閉概念就提出來了
數據都被封閉在各自的線程之中,就不需要同步,這種通過將數據封閉在線程中而避免使用同步的技術稱爲線程封閉。
這裏有兩種方式來使用線程封閉:ThreadLocal和棧封閉

ThreadLocal

它是一個線程級別變量,每個線程都有一個ThreadLocal就是每個線程都擁有了自己獨立的一個變量,競爭條件被徹底消除了,在併發模式下是絕對安全的變量.
用法:ThreadLocal var=new ThreadLocal();
不同的線程去訪問它就拿到不同的內容,每個線程都有ThreadLocal獨立的變量,會自動在每個線程創建一個副本,副本之間彼此獨立,互不影響。可以用ThreadLocal存儲一些參數,以便在線程中多個方法中使用,用來代替方法傳參的做法。

package demo2;

public class demo8 {
    /**threadLocal變量,每個線程都有一個副本,互不干擾**/
    public static ThreadLocal<String> value=new ThreadLocal<>();

    public void threadLocalTest() throws Exception{
        value.set("這個是主線程設置的123");  // 主線程設置值
        String v=value.get();
        System.out.println("線程1執行之前,主線程渠道的值:"+v);

        new Thread(new Runnable() {
            @Override
            public void run() {
                String v=value.get();
                System.out.println("線程1取到的值:"+v);
                //設置threadLocal
                value.set("這是線程1設置的456");
                v=value.get();
                System.out.println("重新設置之後,線程1取到的值:"+v);
                System.out.println("線程1執行結束");
            }
        }).start();
        Thread.sleep(5000L);
        v=value.get();
        System.out.println("線程1執行之後,主線程取到的值:"+v);

    }

    public static void main(String[] args) throws Exception {
        new demo8().threadLocalTest();
    }
}


在這裏插入圖片描述

首先第一個棧設置爲123,之後重新創建一個新的棧的時候,棧的值就爲null,重新賦值爲456,不過最後在打印第一個棧的值的時候,發現還是123

棧封閉

局部變量的固有屬性之一就是封閉在線程中,他們位於執行線程的棧中,其他線程無法訪問這個棧

今天就分享到這裏了,後續還有一系列的課程

發佈了51 篇原創文章 · 獲贊 36 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章