概念:
數據封閉在各自的香橙中,不需要進行數據的同步,這種通過將數據封閉在各自的線程中,避免使用數據同步技術即線程封閉。
線程封閉有兩種方式:
1、ThreadLocal
線程級別的變量,每個線程都有自己獨立的ThreadLocal的變量,在併發模式下是絕對線程安全的。
ThreadLocal會在每個線程上創建一個副本,副本之間是彼此獨立、互不影響的;可以使用ThreadLocal存放參數,方便在線程的多個方法中使用,用來代替方法傳參。
public static ThreadLocal<String> threadlocal = new ThreadLocal<>();
public void threadLocalTest() throws Exception {
threadlocal.set("123");
String v = threadlocal.get();
System.out.println(v);
new Thread(new Runnable() {
@Override
public void run() {
String v = threadlocal.get();
System.out.println("線程取到的值:" + v);
// 設置 threadLocal
threadlocal.set("456");
v = threadlocal.get();
System.out.println("重新設置後,線程取到的值:" + v);
System.out.println("線程執行結束");
}
}).start();
Thread.sleep(5000L);
v = threadlocal.get();
System.out.println("線程執行後,主線程取到的值:" + v);
}
public static void main(String[] args) throws Exception {
new Demo().threadLocalTest();
}
棧封閉(局部變量):
虛擬機棧:每個線程在虛擬機棧中都有一個私有的空間,稱爲線程棧,而線程棧由多個棧幀(Stack Frame)組成。一個線程需要執行一個或多個方法,一個方法對應一個棧幀。棧幀包括局部變量表、操作數棧、動態鏈接、方法返回地址、附件信息等。虛擬機棧內存默認最大是1M,超過就會拋出StackOverflowError(棧溢出)。
局部變量存放在棧幀中的局部變量表中,而每一個棧對應一個線程。