概述
多線程訪問共享數(shù)據(jù)時(shí)晃择,涉及到線程間數(shù)據(jù)同步問題。當(dāng)場(chǎng)景不需要用到數(shù)據(jù)共享時(shí)蛆楞,提出了線程封閉的概念,數(shù)據(jù)封閉在各自的線程之中夹厌,避免數(shù)據(jù)同步豹爹。
具體實(shí)現(xiàn)有:ThreadLocal 局部變量
ThreadLocal
java 中特殊的變量,它是線程級(jí)別的變量矛纹,每個(gè)線程獨(dú)立擁有臂聋,避免并發(fā)編程時(shí)線程安全問題。
用法:ThreadLocal<T> var = new ThreadLocal<>();
會(huì)自動(dòng)給每個(gè)線程創(chuàng)建一個(gè)T副本或南,副本間獨(dú)立孩等,互不影響。
代碼演示:
public class Demo7 {
public ThreadLocal<String> value = new ThreadLocal<>();
public void ThreadLocalTest() throws InterruptedException{
value.set("222222222");
String v = value.get();
System.out.println("線程1執(zhí)行之前采够,主線程取到的值:" + v);
new Thread(()->{
String d = value.get();
System.out.println("線程1取到的值:" + d);
value.set("3333333333333");
d = value.get();
System.out.println("重新設(shè)置之后肄方,線程1取到的值:" + d);
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();
}
}