ThreadLocal实现线程范围的共享变量

2014/03/22 12:04
阅读数 678

hreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另一个线程中则共享另一份数据,线程的数据是独享的。

 ThreadLocal的实现原理:每个线程调用全局ThreadLocal的set方法,就相当于往其内部的Map中增加一条记录,key是各自的线程,value是各自的线程调用set放进的值。在线程结束时可以调用ThreadLocal.clear()方法,可以立即释放内存。也可以不调用,线程运行完成之后内存也会被回收。

ThreadLocal的应用场景:

 (1)订单处理

   (2)银行转账等

  Struts2中ActionContext,同一段代码被不同的线程调用运行时,该代码操纵的是各自的线程的状态和数据。对于不同的线程来说,getContext()拿到的对象都不同,不管拿多少次,不管在哪个模块,这一个线程拿到的都是同一个对象。

下面是一个关于ThreadLocal的例子:

package thread.tradtionnal;

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;
	}
	
	
}

运行结果:

data---1874800790
data----781274110
ThreadA -- Thread-1-age=-781274110,name-Thread[Thread-1,5,main]--781274110
ThreadA -- Thread-0-age=1874800790,name-Thread[Thread-0,5,main]-1874800790
ThreadB -- Thread-0-age=1874800790,name-Thread[Thread-0,5,main]-1874800790
ThreadB -- Thread-1-age=-781274110,name-Thread[Thread-1,5,main]--781274110


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
10 收藏
0
分享
返回顶部
顶部