Java ThreadLocal實現線程范圍的共享變量

jopen 10年前發布 | 13K 次閱讀 Java Java開發

hreadLocal的作用和目的:用于實現線程內的數據共享,即對于相同的程序代碼,多個模塊在同一個線程中運行時要共享一份數據,而在另一個線程中則共享另一份數據,線程的數據是獨享的。

 ThreadLocal的實現原理:每個線程調用全局ThreadLocal的set方法,就相當于往其內部的Map中增加一條記錄,key是各自的線程,value是各自的線程調用set放進的值。在線程結束時可以調用ThreadLocal.clear()方法,可以立即釋放內存。也可以不調用,線程運行完成之后內存也會被回收。

ThreadLocal的應用場景:

 (1)訂單處理

   (2)銀行轉賬等

  Struts2中ActionContext,同一段代碼被不同的線程調用運行時,該代碼操縱的是各自的線程的狀態和數據。對于不同的線程來說,getContext()拿到的對象都不同,不管拿多少次,不管在哪個模塊,這一個線程拿到的都是同一個對象。

下面是一個關于ThreadLocal的例子:

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class ThreadLocalTest {
    //public static int data;

    /**
     * @param args
     */
    public static void main(String[] args) {
        for(int i=0;i<2;i++){

            new Thread(new Runnable(){

                @Override
                public void run() {
                    int data = new Random().nextInt();
                    System.out.println("data---" + data);
                    MyData.getInstance().setAge(data);
                    MyData.getInstance().setName(Thread.currentThread()+"-"+data);
                    new ThreadA().getData();
                    new ThreadB().getData();
                }

            }).start();
        }
    }
    static class ThreadA{
        public void getData(){
            System.out.println("ThreadA -- " + Thread.currentThread().getName()+"-age=" + MyData.getInstance().getAge()+",name-"+ MyData.getInstance().getName());
        }
    }

    static class ThreadB{
        public void getData(){
            System.out.println("ThreadB -- " + Thread.currentThread().getName()+"-age=" + MyData.getInstance().getAge()+",name-"+ MyData.getInstance().getName());
        }
    }


}
class MyData{
    private String name;
    private int age;
    private static MyData instance = null;
    private static ThreadLocal<MyData> map = new ThreadLocal<MyData>();
    private MyData(){};
    public static MyData getInstance(){
        instance = map.get();
        if( instance == null){
            instance = new MyData();
            map.set(instance);
        }
        return instance;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }


}

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!