Java多线程ThreadLocal介绍
在Java多线程环境下ThreadLocal就像一家银行,每个线程就是银行里面的一个客户,每个客户独有一个保险箱来存放金钱,客户之间的金钱不影响。
private static ThreadLocal threadLocal = new ThreadLocal(); //一个ThreadLocal通常被声明为private static,static代表它是多线程共享的
- 每个线程都可以通过调用threadLocal.set()方法来设置自己独有的threadLocal值
- 每个线程都可以通过调用threadLocal.get()方法来设置自己独有的threadLocal值
注意:哪个线程调用threadLocal就输出哪个线程自身的存储空间里面的值(下面MyRun构造器)
public class ThreadLocalTest { private static ThreadLocal threadLocal = new ThreadLocal(); //一个ThreadLocal通常被声明为private static,static代表它是多线程共享的 public static void main(String[] args) { threadLocal.set(200); //设置本线程的值 System.out.println(Thread.currentThread().getName()+"线程的threadLocal的值:"+threadLocal.get()); //哪个线程调用threadLocal的方法就调出哪个线程的本地存储 new Thread(new MyRun()).start(); } static class MyRun implements Runnable{ public MyRun(){ threadLocal.set(400); //上下文还是main,即当前线程还是main线程 System.out.println(Thread.currentThread().getName()+"线程的threadLocal的值:"+threadLocal.get()); //哪个线程调用threadLocal的方法就调出哪个线程的本地存储 } @Override public void run() { threadLocal.set(Math.random()); //设置本线程的值 System.out.println(Thread.currentThread().getName()+"线程的threadLocal的值:"+threadLocal.get()); //哪个线程调用threadLocal的方法就调出哪个线程的本地存储 } } }
ThreadLocal的子类为InheritableThreadLocal,InheritableThreadLocal和ThreadLocal最大的区别在于在一个线程中创建一个子线程时子线程的ThreadLocal会继承父线程的ThreadLocal。