線程封閉
- 多線程中不需要使用共享數(shù)據(jù),使用數(shù)據(jù)封閉避免使用同步的技術(shù)
- 線程封閉的具體實(shí)現(xiàn):ThreadLocal、局部變量
ThreadLocal
它是一個(gè)線程級(jí)別的變量,每個(gè)線程都有擁有自己獨(dú)立的變量,與其他線程互不影響。
用法:ThreadLocal<T> var = new ThreadLocal<T>();
會(huì)自動(dòng)在每一個(gè)線程上創(chuàng)建一個(gè)T的副本,副本之間彼此獨(dú)立,互不影響
package com.study.hc.thread.chapter1.thread;
/** 線程封閉示例 */
public class Demo7 {
/** threadLocal變量,每個(gè)線程都有一個(gè)副本,互不干擾 */
public static ThreadLocal<String> value = new ThreadLocal<>();
/**
* threadlocal測(cè)試
*
* @throws Exception
*/
public void threadLocalTest() throws Exception {
// threadlocal線程封閉示例
value.set("這是主線程設(shè)置的123"); // 主線程設(shè)置值
String v = value.get();
System.out.println("線程1執(zhí)行之前,主線程取到的值:" + v);
new Thread(new Runnable() {
@Override
public void run() {
String v = value.get();
System.out.println("線程1取到的值:" + v);
// 設(shè)置 threadLocal
value.set("這是線程1設(shè)置的456");
v = value.get();
System.out.println("重新設(shè)置之后,線程1取到的值:" + v);
System.out.println("線程1執(zhí)行結(jié)束");
}
}).start();
Thread.sleep(5000L); // 等待所有線程執(zhí)行結(jié)束
v = value.get();
System.out.println("線程1執(zhí)行之后,主線程取到的值:" + v);
}
public static void main(String[] args) throws Exception {
new Demo7().threadLocalTest();
}
}
棧封閉 - 局部變量
局部變量的固有數(shù)據(jù)之一就是封閉在線程中,它們位于執(zhí)行線程的棧中,其他線程無(wú)法放到這個(gè)棧。