ThreadLocal的静态内部类ThreadLocalMap为每个Thread都维护了一个数组table,ThreadLocal确定了一个数组下标,而这个下标就是value存储的对应位置。
ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。
ThreadLocalTest01.java
/**
* ThreadLocal:每个线程自身的存储本地、局部区域
* get/set/initialValue
*/
class ThreadLocalTest01 {
//private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
//更改初始化值
// private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){
// protected Integer initialValue(){
// return 200;
// };
// };
private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(()->200);
public static void main(String[] args) {
//获取值
System.out.println(Thread.currentThread().getName() + "--->" + threadLocal.get());
//设置值
threadLocal.set(99);
System.out.println(Thread.currentThread().getName() + "--->" + threadLocal.get());
new Thread(new Myclass()).start();
new Thread(new Myclass()).start();
}
public static class Myclass implements Runnable{
@Override
public void run() {
threadLocal.set((int)(Math.random() * 99));
System.out.println(Thread.currentThread().getName() + "--->" + threadLocal.get());
}
}
}
运行结果:
main--->200
main--->99
Thread-1--->20
Thread-0--->60
ThreadLocalTest02.java
/**
* ThreadLocal:每个线程自身的数据,更改不会影响其他线程
* get/set/initialValue
*/
class ThreadLocalTest02 {
private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(()->1);
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(new Myclass()).start();
}
}
public static class Myclass implements Runnable{
@Override
public void run() {
Integer g = threadLocal.get();
System.out.println(Thread.currentThread().getName() + "得到了-->" + threadLocal.get());
threadLocal.set(g-1);
System.out.println(Thread.currentThread().getName() + "还剩余-->" + threadLocal.get());
}
}
}
运行结果:
Thread-0得到了-->1
Thread-3得到了-->1
Thread-3还剩余-->0
Thread-2得到了-->1
Thread-2还剩余-->0
Thread-1得到了-->1
Thread-1还剩余-->0
Thread-0还剩余-->0
Thread-4得到了-->1
Thread-4还剩余-->0
ThreadLocalTest03.java
/**
* ThreadLocal:分析上下文 环境 起点
* 1、构造器: 哪里调用,就属于哪里
* 2、run方法:本线程自身
*/
class ThreadLocalTest03 {
private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(()->1);
public static void main(String[] args) {
new Thread(new Myclass()).start();
new Thread(new Myclass()).start();
}
public static class Myclass implements Runnable{
public Myclass(){
System.out.println(Thread.currentThread().getName() + "构造器-->" + threadLocal.get());
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "run方法-->" + threadLocal.get());
}
}
}
运行结果:
main构造器-->1
main构造器-->1
Thread-0run方法-->1
Thread-1run方法-->1
ThreadLocalTest04.java
/**
* InheritableThreadLocal:继承上下文环境的数据,拷贝一份给子线程
* 1、构造器: 哪里调用,就属于哪里
* 2、run方法:本线程自身
*/
class ThreadLocalTest04 {
private static ThreadLocal<Integer> threadLocal = new InheritableThreadLocal();
public static void main(String[] args) {
threadLocal.set(20);
System.out.println(Thread.currentThread().getName() + "-->" + threadLocal.get());
new Thread(()->{
System.out.println(Thread.currentThread().getName() + "-->" + threadLocal.get());
}).start();
}
}
运行结果:
main-->20
Thread-0-->20