java线程:单例隐藏ThreadLocal实现线程数据共享

来源:互联网 发布:oracle数据库的decode 编辑:程序博客网 时间:2024/05/20 05:31

共享的效果图:


A和B需要共享同一线程,同样的另一组A和B共享另一组线程,两组相互之间不受影响。

代码:

package cn.itcast.lesson6;import java.util.Random;public class ThreadLocalTest {public static void main(String[] args) {for(int i=0;i<2;i++){new Thread(new Runnable() {public void run() {int data = new Random().nextInt();System.out.println(Thread.currentThread().getName()+" has put data: " + data);MyThreadScopeData.getThreadInstance().setName("name" + data);MyThreadScopeData.getThreadInstance().setAge(data);new A().get();new B().get();}}).start();}}static class A{public void get(){MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();System.out.println("A from" + Thread.currentThread().getName()+ " getMyData:" + myData.getName()+" , "+ myData.getAge());}}static class B{public void get(){MyThreadScopeData myData =  MyThreadScopeData.getThreadInstance();System.out.println("B from" + Thread.currentThread().getName()+ " getMyData:"+myData.getName()+" , "+ myData.getAge());}}} class  MyThreadScopeData{private MyThreadScopeData(){}//单例隐藏ThreadLocal实现数据共享public static /*synchronized*/ MyThreadScopeData getThreadInstance(){MyThreadScopeData instance = map.get();if(instance == null){instance = new MyThreadScopeData();map.set(instance);}return instance;}private static ThreadLocal<MyThreadScopeData> map = new  ThreadLocal<MyThreadScopeData> ();private String name;private int age;public String getName() {return name;}public  void setName(String name) {this.name = name;}public  void setAge(int age) {this.age = age;}public int getAge() {return age;}}


1 0