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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值