ThreadLocal类的设计流程:
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改,这就是ThreadLocal类的作用。
使用ThreadLocal类解决同步问题:
class Channel { // 要发送的消息体
private static final ThreadLocal<Message> THREADLOCAL = new ThreadLocal<>();
public Channel(){}
public static void setMsg(Message m){
THREADLOCAL.set(m); // 保存数据(当前线程对象)
}
public static void send(){ // 发送消息
System.out.println("【" + Thread.currentThread().getName() + " - 消息发送】:" + THREADLOCAL.get().getInfo()); // get()获取当前对象
}
}
class Message{ // 要发送的消息体
private String info;
public void setInfo(String info) {
this.info = info;
}
public String getInfo() {
return info;
}
}
public class Main {
public static void main(String[] args) {
/*
在 ThreadLocal类里面提供有如下的操作方法:
- 构造方法: public ThreadLocal():
- 设置数据: public void set(T value);
- 取出数据:public T get();
- 删除数据:public void remove();
*/
new Thread(()->{
Message msg = new Message(); // 实例化消息对象
msg.setInfo("1.www.baidu.com"); // 设置发送的内容
Channel.setMsg(msg); // 设置发送的消息对象
Channel.send(); // 发送消息
},"消息发送A").start();
new Thread(()->{
Message msg = new Message(); // 实例化消息对象
msg.setInfo("2.www.sougo.com"); // 设置发送的内容
Channel.setMsg(msg); // 设置发送的消息对象
Channel.send(); // 发送消息
},"消息发送B").start();
new Thread(()->{
Message msg = new Message(); // 实例化消息对象
msg.setInfo("3.www.limeng.com"); // 设置发送的内容
Channel.setMsg(msg); // 设置发送的消息对象
Channel.send(); // 发送消息
},"消息发送C").start();
}
}

每一个线程通过ThreadLocal只允许保存一个数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)