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.