Java ThreadLocal實現線程范圍的共享變量
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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!