ThreadLocal
在多线程并发执行中,为了可以准确的实现每个线程中的数据成员访问,可以通过java.lang.ThreadLocal类实现数据的保存与获取
ThreadLocal类是在多线程并发访问时使用,所以在数据保存时除了保护用户所需要的数据外,还会额外保存一个当前的线程对象,而在获取数据时也将通过当前线程对象来获取保存的数据内容,这样可以保证多线程并发访问下的数据操作安全。
ThreadLocal最大的特点就是可以同时保存多个线程的数据,由于每个数据都有对应的当前线程对象,这样就可以保证数据传输的正确性。可以简单地把ThreadLocal想象成一个公共储物柜,把每一个操作储物柜的客户想象成一个线程,每个线程都只允许操作自己的储物柜。这样就保证了储存物品的安全。
package com.lxh.fifteenchapter;
public class JavaAPIDemo375 {
public static void main(String[] args) {
new Thread(()->{
Message msg=new Message(); //实例化消息主体对象
msg.setInfo("线程A消息:AAA");//设置要发送的内容
Channel.setMessage(msg);//设置要发送的消息
Channel.send();
},"消息发送者A").start();
new Thread(()->{
Message msg=new Message(); //实例化消息主体对象
msg.setInfo("线程B消息:BBB");//设置要发送的内容
Channel.setMessage(msg);//设置要发送的消息
Channel.send();
},"消息发送者B").start();
new Thread(()->{
Message msg=new Message(); //实例化消息主体对象
msg.setInfo("线程C消息:CCC");//设置要发送的内容
Channel.setMessage(msg);//设置要发送的消息
Channel.send();
},"消息发送者C").start();
}
}
class Channel{ //消息发送通道
private static final ThreadLocal<Message> THREADLOCAL=new ThreadLocal<Message>();
private Channel() {}
public static void setMessage(Message m) {
THREADLOCAL.set(m);
}
public static void send() {
System.out.print("【‘"+Thread.currentThread().getName()+"、消息发送】"+THREADLOCAL.get().getInfo());
}
}
class Message{ //消息体
private String info;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
执行结果
【‘消息发送者B、消息发送】线程B消息:BBB【‘消息发送者C、消息发送】线程C消息:CCC【‘消息发送者A、消息发送】线程A消息:AAA