笔记摘要
所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类ThreadLocal,对于线程范围内共享数据的应用,在ThreadLocal的应用场景中进行了介绍,然后主要对它的使用进行讲解,演示了由单一数据的共享到将多个数据封装到一个对象中,然后进行共享。在开始先用一个Map集合简单实现线程范围内数据的共享
1. 使用Map实现线程范围内数据的共享
原理:将线程对象作为map的键存入,这样就保证了map对象的唯一,也就保证了线程内数据的唯一
关键: 明确一点,把当前线程对象作为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) {
//启动两个线程
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()
+ " has put data :" + data);
//把当前线程对象作为键,就可以保证map对象的唯一,即保证线程内的数据唯一
threadData.put(Thread.currentThread(), data);
new A().get();
new B().get();
}
}).start();
}
}
//定义一个类模拟获取数据
static class A{
public void get(){
int data = threadData.get(Thread.currentThread());
System.out.println("A from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
static class B{
public void get(){
int data = threadData.get(Thread.currentThread());
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
}
打印结果
Thread-0 has put data:-49248136
Thread-1 has put data:311124475
A from Thread-0 get data:-49248136
A from Thread-1 get