在多线程中,对同一个公共资源同时覆写输出,会产生相同的值,这时使用ThreadLocal类方法使每次覆写只能被保存一次并且有对应线程的标记,可实现隔离操作
//被操作类
class Message {
private String note;
public void setNote(String note) {
this.note = note;
}
public String getNote() {
return note;
}
}
//输出类
class MessageConsumer {
public void print() {
System.out.println(Thread.currentThread().getName() + " = " + Myutil.get().getNote());
}
}
/*
* ThreadLocal<>为泛型,类型为被操作类类型
*/
class Myutil {
private static ThreadLocal<Message> threadlocal = new ThreadLocal<Message>(); //实例化该类
public static void set(Message msg) { //使用该类的set()方法,只能传递一个参数
threadlocal.set(msg); //该msg在传入该类时被保存一个currentThrad值,对应该线程
}
public static Message get() {
return threadlocal.get(); //在获取msg时,只能过去对应标记的msg值
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
new Thread(() -> {
Message msg = new Message();
msg.setNote("美国");
Myutil.set(msg); //设置msg属性并被ThreadLocal标记
new MessageConsumer().print(); //运行用户A线程的变量
},"用户A").start();
new Thread(() -> {
Message msg = new Message();
msg.setNote("中国");
Myutil.set(msg);
new MessageConsumer().print();
},"用户B").start();
}
}
(使用场景:通过线程让某运行类工作,实例化该类工作需要的类型参数但不手动传入,由该类自身调用参数运行,我们只需要把参数放在全局变量ThreadLocal中,那么每个线程产生的运行类都会获取对应线程的参数)