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();
}
}
![](https://img2022.cnblogs.com/blog/2651506/202202/2651506-20220206222523751-1849493466.png)
每一个线程通过ThreadLocal只允许保存一个数据。