现在的位置: 首页 > 综合 > 正文

ThreadLocal 线程内的数据共享(线程间隔离)

2013年01月09日 ⁄ 综合 ⁄ 共 2708字 ⁄ 字号 评论关闭
package multithreading;

import java.util.Random;

//ThreadLocal<Integer>内部是用Map<Thread,Integer>实现的,线程之间独立数据
//localData单个变量
//ThreadScopeData  多个变量的集合
public class ThreadLocalTest {
	
	static ThreadLocal<Integer> localData=new ThreadLocal<Integer>();
	
	static class A{
		public static void getData(){
			System.out.println("Class A在"+Thread.currentThread().getName()+"取得localData:"+localData.get());
			
			//获得当前线程的数据
			ThreadScopeData data=ThreadScopeData.getInstance();
			System.out.println("Class A在"+Thread.currentThread().getName()+"取得ThreadScopeData:"+
					data.name+data.age);
		}
	}
	
	static class B{
		public static void getData(){
			System.out.println("Class B在"+Thread.currentThread().getName()+"取得localData:"+localData.get());
			//获得当前线程的数据
			ThreadScopeData data=ThreadScopeData.getInstance();
			System.out.println("Class B在"+Thread.currentThread().getName()+"取得ThreadScopeData:"+
					data.name+data.age);
		}
	}

	public static void main(String[] args) {

		for(int i=1;i<=2;i++){//启动2个线程
			new Thread(new Runnable() {
				@Override
				public void run() {//产生并保存数据
					int intData=new Random().nextInt(100);
					
					//====================1个变量===========================
					System.out.println(Thread.currentThread().getName()+"产生数据"+intData+"。保存在localData");
					localData.set(intData);
					//====================多个变量===========================
					System.out.println(Thread.currentThread().getName()+"产生数据保存在ThreadScopeData");
					ThreadScopeData data=ThreadScopeData.getInstance();
					data.age=intData;
					data.name="name"+String.valueOf(intData);
					
					//============线程模块去数据==================
					 A.getData();
					 B.getData();
				}
			}).start();
		}
	}

}


class ThreadScopeData{
	
	public String name;
	public int age;
	
	//单例
	private ThreadScopeData(){}
	
	private static ThreadLocal<ThreadScopeData> map=new ThreadLocal<ThreadScopeData>();
	
	public static ThreadScopeData getInstance(){
		ThreadScopeData instance=map.get();//每个线程都有独立的数据
		if(instance==null){
			instance=new ThreadScopeData();
			map.set(instance);
		}
		return instance;
	}
}

原理

package multithreading;

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

public class ThreadShareData {

	/**
	 * 多个线程调用相同代码 但是线程之间独立数据
	 * Tread1 对应connection1 (conn.beginTransaction 。。。汇款,取款。。。conn.commit)
	 * Tread2 对应connection2 (conn.beginTransaction 。。。汇款,取款。。。conn.commit)
	 * 线程1不应该与线程2操作相同的connection,不然导致线程2汇完款还没取款就被线程1提交了
	 * 
	 */
	
	static Map<Thread, Integer> dataMap=new HashMap<Thread, Integer>();
	
	public static void main(String[] args) {
		for (int i = 0; i < 3; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					int data=new Random().nextInt();
					dataMap.put(Thread.currentThread(), data);
					new Option1().get();
					new Option2().put();
				}
			}).start();
		}

	}

	
	static class Option1{
		void get(){
			System.out.println("Option1 Thread:"+Thread.currentThread().getName()+
					"。get Data:"+dataMap.get(Thread.currentThread()));
		}
	}
	
	static class Option2{
		void put(){
			System.out.println("Option2 Thread:"+Thread.currentThread().getName()+
					"。put Data:"+dataMap.get(Thread.currentThread()));
		}
	}
	
}

抱歉!评论已关闭.