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