線程封閉
概念
多線程訪問共享可變數據時,涉及到線程安全,線程間數據同步的問題。並不是所有時候,都要用到共享數據,所以線程封閉概念就提出來了
數據都被封閉在各自的線程之中,就不需要同步,這種通過將數據封閉在線程中而避免使用同步的技術稱爲線程封閉。
這裏有兩種方式來使用線程封閉: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
棧封閉
局部變量的固有屬性之一就是封閉在線程中,他們位於執行線程的棧中,其他線程無法訪問這個棧
今天就分享到這裏了,後續還有一系列的課程