面试:情节是ThreadLocal的原理
ThreadLocal内部包含一个TheadLocalMap,key为各个线程的变量,value为要存储的对象,这样线程中的变量不被其他线程干扰。
public class ThreadLoal {
public static void main(String[] args) {
new Thread(()->{
Message msg = new Message();
msg.setInfo("NiHaoA");
Chanel chanel = new Chanel();
chanel.setMessage(msg);
chanel.send();
},"线程A").start();
new Thread(()->{
Message msg = new Message();
msg.setInfo("NiHaoB");
Chanel chanel = new Chanel();
chanel.setMessage(msg);
chanel.send();
},"线程B").start();
new Thread(()->{
Message msg = new Message();
msg.setInfo("NiHaoC");
Chanel chanel = new Chanel();
chanel.setMessage(msg);
chanel.send();
},"线程C").start();
}
}
//每个线程进入Chanel类获取相应的message对象
class Chanel{
//private static Message message;//satic表示message对象由Chanel类管理,即使多个Chanle只会对应一个message
private static ThreadLocal<Message> threadLocal = new ThreadLocal<>();
public void setMessage(Message message){
//this.message = message;
threadLocal.set(message);
}
public void send(){
//System.out.println(Thread.currentThread().getName()+message.getInfo());
System.out.println(Thread.currentThread().getName()+threadLocal.get().getInfo());
}
}
class Message {
private String info;
public Message(){}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
运行结果:
线程BNiHaoB
线程ANiHaoA
线程CNiHaoC