zoukankan      html  css  js  c++  java
  • 线程变量(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变量是隔开的。

  • 相关阅读:
    Redhat 7使用CentOS 7的Yum网络源
    指定YUM安装包的体系结构或版本
    CURL常用命令
    VIM技巧之去除代码行号并缩进代码
    VIM 中鼠标选择不选中行号
    linux服务器性能优化
    阻塞,非阻塞,同步,异步
    WEB三层架构与MVC
    mvc与三层结构
    Centos环境下Tomcat启动缓慢
  • 原文地址:https://www.cnblogs.com/flying607/p/5460937.html
Copyright © 2011-2022 走看看