以下只是我的粗略看法,还在学习中。
java.lang.ThreadLocal类,这个类提供了线程局部变量,每个线程都可以有自己的局部变量。
只要线程存在并且ThreadLocal类可以访问,那么线程就可以有对其局部变量的隐式访问。
当线程消失的时候,线程局部变量的拷贝都会被回收,除非还有其他对其的引用
public class ThreadLocal<T>
extends Object
方法:
public T get()
public void set(T value)
public void remove()
例如:
class Message{
private static ThreadLocal<String> threadlocal = new ThreadLocal<String>();
private static String msg;
public void setMessage(String msg) {
//Message.threadlocal.set(msg);
this.msg =msg;
}
public void say() {
System.out.println(Thread.currentThread().getName()+"----"+this.msg);
}
}
public class Run {
public static void main(String[] args) {
for(int i = 0;i<3;i++) {
int idex = i;
new Thread(() ->{
Message m = new Message();
m.setMessage("Hello"+idex);
m.say();
}
,"线程"+idex).start();;
}
}
}
输出:
线程1----Hello2
线程0----Hello2
线程2----Hello2
即表明5个线程都共享同一个变量age,所以修改一个其他的都变了;
使用ThreadLocal之后:
class Message{
private static ThreadLocal<String> threadlocal = new ThreadLocal<String>();
private static String msg;
public void setMessage(String msg) {
Message.threadlocal.set(msg);
}
public void say() {
System.out.println(Thread.currentThread().getName()+"----"+Message.threadlocal.get());
}
}
public class Run {
public static void main(String[] args) {
for(int i = 0;i<3;i++) {
int idex = i;
new Thread(() ->{
Message m = new Message();
m.setMessage("Hello"+idex);
m.say();
}
,"线程"+idex).start();;
}
}
}
输出:
线程0----Hello0
线程2----Hello2
线程1----Hello1
因为每个线程都有自己的局部变量保存在ThreadLocal中。