JAVA----ThreadLocal

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

發佈了43 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章