1.ThreadLocal是什麼?
1.其實ThreadLocal跟Synchronized一樣,都是一個爲了解決變量變化問題,類似給變量加鎖;
2.實際上使用了ThreadLocal,相當於對對本地線程中的變量或者變量對象的引用copy一份,這樣就使得各個線程中
的變量和對象互不影響;這樣各個線程在高併發場景下,適合各個線程不共享變量值的操作;
3.ThreadLocal是無狀態的,所謂的無狀態主要是指的ThreadLocal中的變量都是相互隔離的,
線程間變量變化是不影響其他線程中的變量值得
2.ThreadLocal的工作原理?
1.ThreadLocal中使用ThreadLocalMap去存儲變量相關的數據
其中ThreadLocal本身對象this作爲key,value爲變量的副本;
2.get()方法用於獲取當前線程的副本變量值。
set()方法用於保存當前線程的副本變量值。
initialValue()爲當前線程初始副本變量值。
remove()方法移除當前線程的副本變量值。
3.如何解決ThreadLocal的內存泄漏問題
4.案例
package com.gaoxinfu.demo.jdk.rt.java.lang.thread;
public class ThreadLocalDemo {
private static ThreadLocal<String> nameThreadLocal=new ThreadLocal<String>(){
@Override
protected String initialValue() {
return "gaoxinfu";
}
};
public static void main(String[] args) {
for (int i=0;i<5;i++){
new Thread(()->{
System.out.println("Thread Name = "+Thread.currentThread().getName()+",Name = "+nameThreadLocal.get());
},"thread"+i).start();
}
}
}
com.gaoxinfu.demo.jdk.rt.java.lang.thread.ThreadLocalDemo
Thread Name = thread0,Name = gaoxinfu
Thread Name = thread1,Name = gaoxinfu
Thread Name = thread2,Name = gaoxinfu
Thread Name = thread3,Name = gaoxinfu
Thread Name = thread4,Name = gaoxinfu