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