線程封閉(ThreadLocal,棧封閉即局部變量)

概念:

數據封閉在各自的香橙中,不需要進行數據的同步,這種通過將數據封閉在各自的線程中,避免使用數據同步技術即線程封閉。

線程封閉有兩種方式:

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();
	}

棧封閉(局部變量):

參考《java運行原理》中的虛擬機棧

虛擬機棧:每個線程在虛擬機棧中都有一個私有的空間,稱爲線程棧,而線程棧由多個棧幀(Stack Frame)組成。一個線程需要執行一個或多個方法,一個方法對應一個棧幀。棧幀包括局部變量表、操作數棧、動態鏈接、方法返回地址、附件信息等。虛擬機棧內存默認最大是1M,超過就會拋出StackOverflowError(棧溢出)。
 

局部變量存放在棧幀中的局部變量表中,而每一個棧對應一個線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章