线程局部变量共享 -- 使用ThreadLocal解决该需求

1.创建容器类

java 复制代码
//容器类
public class Contain {

	private static final ThreadLocal<DataPackage> local;
	
	 static {
		 local = new ThreadLocal<>();
	 }

	public static ThreadLocal<DataPackage> getLocal() {
		return local;
	}
}

2.创建数据包类

java 复制代码
//数据包类
public class DataPackage {
	
	private String str;
	private int num;
	
	public static DataPackage getInstance(String str, int num) {
		//获取当前线程共享的DataPackage对象
		ThreadLocal<DataPackage> local = Contain.getLocal();
		DataPackage dataPackage = local.get();
		
		if(dataPackage == null) {
			dataPackage = new DataPackage(str, num);
			local.set(dataPackage);
		}else {
			dataPackage.setStr(str);
			dataPackage.setNum(num);
		}
		return dataPackage;
	}
	
	private DataPackage(String str, int num) {
		super();
		this.str = str;
		this.num = num;
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return "DataPackage [str=" + str + ", num=" + num + "]";
	}
	
}

3.创建A类B类

java 复制代码
public class A {
	 
	public void println() {
		
		//获取容器
		ThreadLocal<DataPackage> local = Contain.getLocal();
		
		//通过当前线程获取对应的共享数据
		Thread t = Thread.currentThread();
		DataPackage data = local.get();
		System.out.println(t.getName() + "里的A类对象获取了数据:" + data);
		
	}

}

public class B {
	
	public void println() {
		
		ThreadLocal<DataPackage> local = Contain.getLocal();
		
		Thread t = Thread.currentThread();
		DataPackage data = local.get();
		System.out.println(t.getName() + "里的B类对象获取了数据:" + data);
		
	}

}

4.创建测试类

java 复制代码
public class Test01 {

	//知识点:线程局部变量共享的问题 -- 使用ThreadLocal解决该需求
	public static void main(String[] args) {

		//线程1
		new Thread(new Runnable() {

			@Override
			public void run() {
				//共享的数据
				DataPackage dataPackage = DataPackage.getInstance("我好像在哪见过你", 10);

				//获取容器,并存储数据
				ThreadLocal<DataPackage> local = Contain.getLocal();
				local.set(dataPackage);

				//创建对象
				A a = new A();
				B b = new B();

				//获取共享数据
				a.println();
				b.println();

			}
		},"线程1").start();

		//线程2
		new Thread(new Runnable() {

			@Override
			public void run() {
				//共享的数据
				DataPackage dataPackage = DataPackage.getInstance("明明就", 20);
						
				//获取容器,并存储数据
				ThreadLocal<DataPackage> local = Contain.getLocal();
				local.set(dataPackage);

				//创建对象
				A a = new A();
				B b = new B();

				//获取共享数据
				a.println();
				b.println();
				
			}
		},"线程2").start();

	}

}
相关推荐
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司9 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地10 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
段一凡-华北理工大学11 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe11 小时前
C++——多态
开发语言·c++
心平气和量大福大11 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
莫逸风13 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_13 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸13 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程