執行緒封閉之ThreadLocal和棧封閉

2021-09-29 07:08:39 字數 848 閱讀 2807

當訪問共享資料時,通常是要使用同步。如果要避免使用同步,就是不提供共享資料。如果僅在單執行緒中訪問資料,就不需要同步,這種技術就叫做執行緒封閉,它是實現執行緒安全最簡單的方式之一。當某個物件封閉在乙個執行緒當中時將自動實現執行緒安全性,即使被封閉的物件本身它並不是安全的,實現執行緒主要有三種方式。

ad-hoc是指維護執行緒封閉是由程式自己去實現和維護。ad-hoc非常脆弱,因為它沒有一種語言特性,例如可見性修飾符或區域性變數,能將物件封閉到特定的執行緒上。

棧封閉簡單理解就是通過區域性變數來實現執行緒封閉,多個執行緒訪問物件的同乙個方法,方法內部的區域性變數會拷貝到每個執行緒的執行緒棧當中,只有當前執行緒才能訪問到,互不干擾。所以區域性變數是不被多個執行緒所共享的。

示例:

public class threadtest 

}).start();

thread.sleep(5000l); // 等待所有執行緒執行結束

v = value.get();

system.out.println("執行緒1執行之後,主線程取到的值:" + v);

}public static void main(string args) throws exception 

}# 結果

執行緒1執行之前,主線程取到的值:這是主線程設定的123

執行緒1取到的值:null

重新設定之後,執行緒1取到的值:這是執行緒1設定的456

執行緒1執行結束

執行緒1執行之後,主線程取到的值:這是主線程設定的123

通過**示例,可以看到主線程和子執行緒的執行結果互不干擾。當某個頻繁執行的操作需要乙個臨時物件,例如乙個緩衝區,而同時又希望避免在每次執行時都重新分配該臨時物件,就可以使用threadlocal。

java併發之執行緒封閉

實現好的併發是一件困難的事情,所以很多時候我們都想躲避併發。避免併發最簡單的方法就是執行緒封閉。什麼是執行緒封閉呢?就是把物件封裝到乙個執行緒裡,只有這乙個執行緒能看到此物件。那麼這個物件就算不是執行緒安全的也不會出現任何安全問題。實現執行緒封閉有哪些方法呢?這是完全靠實現者控制的執行緒封閉,他的執...

執行緒封閉threadlocal和棧封閉

threadlocal是j a裡面的特殊變數 他是乙個執行緒級別的變數,每個執行緒都有乙個threadlocal就是每個執行緒都有自己的獨立的乙個變數 競爭狀態下被徹底消除了,在併發模式下是絕對安全的變數 用法 thread localvar new threadlocal 會自動在那個執行緒中建立...

java執行緒封閉

package com.ly.study.base 執行緒封閉示例 public class threadlocaltestclass start thread.sleep 5000l 等待所有執行緒執行結束 v value.get system.out.println 執行緒1執行之後,主線程取到...