线程变量(ThreadLocal)的使用和测试
2016-05-05 10:37
204 查看
ThreadLocal可以定义线程范围的变量,也可以称之为线程局部变量。与一般的变量的区别在于,生命周期是在线程范围内的。
也就是说某个类的某个对象(为清晰描述,以下称A对象)里面有个ThreadLocal变量,
那么每开一个线程,在线程中第一次调用A对象,都会先初始化该变量的值,并且不会对其他线程中的A对象产生影响。测试如下:
真正的测试类:
打印结果:
IBase
BaseImpl
主线程中:true
线程中:false
可以得出结论,不论在第一个创建的线程还是在主线程中修改onlyCallLocalFlg 的值,都不会对第二个线程产生影响。
小贴士:
static变量是的生命周期与类的使用周期相同,即只要类存在,那么static变量也就存在。
那么一个 static 的 ThreadLocal会是什么样的呢?
static的ThreadLocal变量是一个与线程相关的静态变量,即一个线程内,static变量是被各个实例共同引用的,但是不同线程内,static变量是隔开的。
也就是说某个类的某个对象(为清晰描述,以下称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变量是隔开的。
相关文章推荐
- spring+springmvc声明式事务失效
- CoordinatorLayout+CollapsingToolbarLayout+Toolbar+Listview/Gridview
- apache CXF wsdl2java工具的简单使用
- JavaScript学习总结(五)——Javascript中==和===的区别
- iOS 弹出选项卡,并附带遮罩
- LeetCode 217: Contains Duplicate
- TCP编程
- 160 thinkphp pdo方式链接数据库
- java实现图片验证码全套实现方式
- Android 自定义View (一)
- 获取验证码倒计时
- opencv源码解读——haartraining
- JavaScript跨域总结与解决办法
- 启动MongoDB时遇到的坑
- Notepad++ 自定义 httpd.conf 文件语法高亮
- Python日志记录(logging)
- [spring源码学习]六、IOC源码-BeanFactory和factory-bean
- 给现有MVC 项目添加 WebAPI
- hdu 1004 Let the Balloon Rise
- 不将visio的白色背景复制到ppt上