概述
变量值的共享可以使用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();
}
}
}
运行结果
![](https://img.haomeiwen.com/i19619362/e02cb5a7ebdd3028.png)
可以看出,每个线程运行设定的值,对应的都是该线程所取到的值。
查看ThreadLocal类中源码,可以发现它的初始值为null
![](https://img.haomeiwen.com/i19619362/914795779f495aab.png)
如果不想初始值为null,可以写个子类集成它并重写 initialValue()
InheritableThreadLocal类可以让子线程取得父线程继承过来的值。
网友评论