线程变量(ThreadLocal)的使用和测试

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变量是隔开的。

原文地址:https://www.cnblogs.com/flying607/p/5460937.html