以下只是我的粗略看法,還在學習中。
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中。