变量值的共享可以使用public static变量的形式,所有的线程都使用一个public static变量,而ThreadLocal是为了每个线程都有自己的共享变量,也就是存放自己线程的私有数据。原理是每个线程绑定一个ThreadLocalMap,而ThreadLocal作为ThreadLocalMap的key值放入,也就是一个线程可以绑定多个ThreadLocal对象。
package com.shawshank.study2;
/**
* Created by shawshank on 2016/11/28.
*/
public class ThreadLocalUtils {
public static ThreadLocal<String> threadLocal = new ThreadLocal<String>();
}
package com.shawshank.study2;
/**
* Created by shawshank on 2016/11/28.
*/
public class ThreadA extends Thread{
@Override
public void run() {
for(int i=0;i<100;i++){
ThreadLocalUtils.threadLocal.set(Thread.currentThread().getName()+"-"+i);
System.out.println(Thread.currentThread().getName()+"取出"+ThreadLocalUtils.threadLocal.get());
}
}
}
package com.shawshank.study2;
/**
* Created by shawshank on 2016/11/28.
*/
public class ThreadB extends Thread{
@Override
public void run() {
for(int i=0;i<100;i++){
ThreadLocalUtils.threadLocal.set(Thread.currentThread().getName()+"-"+i);
System.out.println(Thread.currentThread().getName()+"取出"+ThreadLocalUtils.threadLocal.get());
}
}
}
package com.shawshank.study2;
/**
* Created by shawshank on 2016/11/28.
*/
public class ThreadLocalTest {
public static void main(String[] args) {
Thread threadA = new ThreadA();
Thread threadB = new ThreadB();
threadA.start();
threadB.start();
for(int i=0;i<100;i++){
ThreadLocalUtils.threadLocal.set(Thread.currentThread().getName()+"-"+i);
System.out.println(Thread.currentThread().getName()+"取出"+ThreadLocalUtils.threadLocal.get());
}
}
}
运行后的结果
可以看出多个线程往一个public static的ThreadLocal变量存放数据,但是拿出来的数据都是对应每个线程的,也就是每个线程私有的数据,这样就做到每个线程变量的隔离了。
以后有其他地方使用到再补充….