线程局部变量共享 -- 使用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();

	}

}
相关推荐
咖啡八杯6 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
用户1285261160214 小时前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk14 小时前
组件 = 模板 + 业务逻辑
java·前端·vue.js
星沉远浦15 小时前
用Gemini高效解决Java代码报错难以定位的问题
java
用户2986985301419 小时前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快19 小时前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码19 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking19 小时前
Java微服务练习方式
java·后端·微服务
朦胧之1 天前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅1 天前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java