美文网首页
Java并发编程:ThreadLocal的使用

Java并发编程:ThreadLocal的使用

作者: singleZhang2010 | 来源:发表于2020-12-01 11:21 被阅读0次

概述

变量值的共享可以使用public static变量的形式, 所有的线程都使用同一个public static变量。如果想实现每一个线程都有自己的共享变量该如何解决呢?
JDK中提供的类ThreadLocal正是为了解决这样的问题。ThreadLocal类主要解决的就是每个线程绑定自己的值, 可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。
看一下如下代码:
Tools.java

package com.zhxin.threadLab.threadlocal.chapter1;

/**
 * @ClassName Tools
 * @Description //ThreadLocal 测试
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/11/28 0028 下午 3:37
 **/
public class Tools {
    public static ThreadLocal t1 = new ThreadLocal();
}

ThreadA.java

package com.zhxin.threadLab.threadlocal.chapter1;

/**
 * @ClassName ThreadA
 * @Description //ThreadA
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/11/28 0028 下午 3:37
 **/
public class ThreadA extends Thread {
    @Override
    public void run(){
        try{
            for(int i = 0;i<5;i++){
                Tools.t1.set("ThreadA"+(i+1));
                System.out.println("ThreadA get value :" + Tools.t1.get());
                Thread.sleep(200);
            }
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

ThreadB.java

package com.zhxin.threadLab.threadlocal.chapter1;

/**
 * @ClassName ThreadB
 * @Description //ThreadB
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/11/28 0028 下午 3:40
 **/
public class ThreadB extends Thread {
    @Override
    public void run(){
        try{
            for(int i = 0;i<5;i++){
                Tools.t1.set("ThreadB"+(i+1));
                System.out.println("ThreadB get value :" + Tools.t1.get());
                Thread.sleep(200);
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

RunTest.java

package com.zhxin.threadLab.threadlocal.chapter1;

/**
 * @ClassName RunTest
 * @Description // 验证ThreadLocal变量的隔离性 测试示例
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/11/28 0028 下午 3:41
 **/
public class RunTest {
    public static void main(String[] args){
        try{
            ThreadA a = new ThreadA();
            ThreadB b = new ThreadB();
            a.start();
            b.start();
            for(int i=0;i<5;i++){
                Tools.t1.set("MAIN"+(i+1));
                System.out.println("MAIN get value :" + Tools.t1.get());
                Thread.sleep(200);
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

运行结果


image.png

可以看出,每个线程运行设定的值,对应的都是该线程所取到的值。

查看ThreadLocal类中源码,可以发现它的初始值为null


image.png

如果不想初始值为null,可以写个子类集成它并重写 initialValue()

InheritableThreadLocal类可以让子线程取得父线程继承过来的值。

相关文章

网友评论

      本文标题:Java并发编程:ThreadLocal的使用

      本文链接:https://www.haomeiwen.com/subject/tdzqwktx.html