ThreadLocal:
線程變量,是一個以ThreadLocal對象爲鍵、任意對象爲值的存儲結構。爲每個線程單獨存放一份變量副本,也就是說一個線程可以根據一個ThreadLocal對象查詢到綁定在這個線程上的一個值。
只要線程處於活動狀態並且ThreadLocal實例可訪問,那麼每個線程都擁有對其本地線程副本的隱式引用變量一個線程消失後,它的所有副本線程局部實例受垃圾回收(除非其他存在對這些副本的引用)
一般用的比較多的是
1、ThreadLocal.get: 獲取ThreadLocal中當前線程共享變量的值。
2、ThreadLocal.set: 設置ThreadLocal中當前線程共享變量的值。
3、ThreadLocal.remove: 移除ThreadLocal中當前線程共享變量的值。
4、ThreadLocal.initialValue: ThreadLocal沒有被當前線程賦值時或當前線程剛調用remove方法後調用get方法,返回此方法值。
package java.lang;
/**
* instance is accessible; after a thread goes away, all of its copies of
* thread-local instances are subject to garbage collection (unless other
* references to these copies exist).
*
* @author Josh Bloch and Doug Lea
* @since 1.2
*/
public class ThreadLocal<T> {
}
注意並不是併發包裏面的,是lang包裏面的.
1.2就有這個類了.
Demo:
public class ThreadLocalDemo {
ThreadLocal<Integer> num = ThreadLocal.withInitial(() -> 0);
public void inCreate() {
Integer myNum = num.get();
myNum++;
System.out.println(Thread.currentThread().getName() + "---> " + myNum);
num.set(myNum);
}
public static void main(String[] args) {
ThreadLocalDemo threadLocalDemo = new ThreadLocalDemo();
for (int i = 0; i < 3; i++) {
new Thread(() -> {
while (true) {
threadLocalDemo.inCreate();
try {
Thread.sleep(500L);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
/*
* 測試結果: 每個線程都有自己的副本. 都在遞增自己變量. 互相不影響.
*/
}
--end.