如果希望所有线程都使用同一个变量,但是每一个线程在使用这个变量的时候,都能维护自己的值,应该怎么办?ThreadLocal就能实现这个功能。 先看一下代码 final static ThreadLocal threadLocal = new ThreadLocal(); public static void main(String[] args) { for (int i=0;i<3;i++){ Thread thread =new Thread(new RClass2(threadLocal)); thread.start(); } } } class RClass2 implements Runnable{ ThreadLocal threadLocal; RClass2(ThreadLocal threadLocal){ this.threadLocal = threadLocal; } @Override public void run() { for (int i=0;i<3;i++){ threadLocal.set(i); System.out.println(Thread.currentThread().getName()+"/" +threadLocal.get()+threadLocal); } } 运行后的结果 Thread-2/0/java.lang.ThreadLocal@d9d8ad0 Thread-2/1/java.lang.ThreadLocal@d9d8ad0 Thread-2/2/java.lang.ThreadLocal@d9d8ad0 Thread-0/0/java.lang.ThreadLocal@d9d8ad0 Thread-0/1/java.lang.ThreadLocal@d9d8ad0 Thread-0/2/java.lang.ThreadLocal@d9d8ad0 Thread-1/0/java.lang.ThreadLocal@d9d8ad0 Thread-1/1/java.lang.ThreadLocal@d9d8ad0 Thread-1/2/java.lang.ThreadLocal@d9d8ad0
可以看到,每一个threadLocal都是同一个对象,但是线程内部对于threadLocal的维护是独立完成的,相互之前不干扰,Thread-1的累加不会影响到Thread-2,就是所说的线程隔离,相对应的,volatile就是线程间数据共享。
原理介绍,ThreadLocal内部有个ThreadLocalMap,然后用线程的ID作为Map的key,实例对象作为Map的value,这样就能达到各个线程的值隔离的效果。