高级并发编程之 线程范围内安全共享数据(使用Map方式)

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



public class ThreadScopeShareData {

	private static int data=0;
	private static Map<Thread,Integer> threadData=new HashMap<Thread,Integer>();//与线程绑定,不同的线程之间的数据相互独立
	public static void main(String[] args) {
		 final A a=new A();
		 final B b=new B();
		for(int i=0;i<2;i++){
		new Thread(new Runnable(){

			@Override
			public void run() {
			
			int	data=new Random().nextInt();
				System.out.println(Thread.currentThread().getName()+"已经放置了数据"+data);
				threadData.put(Thread.currentThread(), data);
				a.get();
				b.get();
			}
			
		}).start();
		}
	}
	static class A{
		public int get(){
		int data=threadData.get(Thread.currentThread());
		System.out.println("A from "+Thread.currentThread().getName()+":"+data);
			return data;
		}
	}
	static class B{
	    public int get(){
	    	int data=threadData.get(Thread.currentThread());
	    	System.out.println("B from "+Thread.currentThread().getName()+":"+data);
	    	return data;
	    }
	}
	
}
运行结果如下:
Thread-0已经放置了数据-144147512
Thread-1已经放置了数据1063579285
A from Thread-0:-144147512
A from Thread-1:1063579285
B from Thread-0:-144147512
B from Thread-1:1063579285

解析:线程范围内安全共享数据


虽然一直都是对象a在取数据,但是在两个不同的线程内,a.get()方法取到了不同的值,原因就在于map<Thread,Integer>的设计,数据与线程绑定,因此在不同的线程中,取到的数据也不同。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值