ThreadLocal可以定义线程范围的变量,也可以称之为线程局部变量。与一般的变量的区别在于,生命周期是在线程范围内的。
也就是说某个类的某个对象(为清晰描述,以下称A对象)里面有个ThreadLocal变量,
那么每开一个线程,在线程中第一次调用A对象,都会先初始化该变量的值,并且不会对其他线程中的A对象产生影响。测试如下:
public interface IBase { public static final ThreadLocal<Boolean> onlyCallLocalFlg = new ThreadLocal<Boolean>(){ protected Boolean initialValue(){ return false; } }; }
public class BaseImpl implements IBase { }
真正的测试类:
public class TestClassName { public static void main(String[] args) { BaseImpl baseImpl = new BaseImpl(); final IBase base = (IBase)baseImpl; base.onlyCallLocalFlg.get(); //System.out.println(base.onlyCallLocalFlg.get()); System.out.println(base.getClass().getInterfaces()[0].getSimpleName()); System.out.println(base.getClass().getSimpleName()); new Thread() { public void run() { base.onlyCallLocalFlg.set(true); } }.start(); base.onlyCallLocalFlg.set(true); new Thread() { public void run() { System.out.println("线程中:"+base.onlyCallLocalFlg.get()); } }.start(); System.out.println("主线程中:"+base.onlyCallLocalFlg.get()); } }
打印结果:
IBase
BaseImpl
主线程中:true
线程中:false
可以得出结论,不论在第一个创建的线程还是在主线程中修改onlyCallLocalFlg 的值,都不会对第二个线程产生影响。
小贴士:
static变量是的生命周期与类的使用周期相同,即只要类存在,那么static变量也就存在。
那么一个 static 的 ThreadLocal会是什么样的呢?
static的ThreadLocal变量是一个与线程相关的静态变量,即一个线程内,static变量是被各个实例共同引用的,但是不同线程内,static变量是隔开的。