线程资源共享3

来源:互联网 发布:淘宝里的企业店铺好吗 编辑:程序博客网 时间:2024/05/23 01:25
public class ThreadLocalTest {//这是第三种改进的方式用为线程数据共享。这种方式主要设计思想是运用单例模式,当每个线程产生的对应的对象存放到一个ThreadLocal中去。//然后在线程中来获取。private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>();public static void main(String[] args) {//同样两条线程for(int i=0;i<2;i++){new Thread(new Runnable(){@Overridepublic void run() {int data = new Random().nextInt();System.out.println(Thread.currentThread().getName() + " has put data :" + data);x.set(data);/*MyThreadScopeData myData = new MyThreadScopeData();myData.setName("name" + data);myData.setAge(data);myThreadScopeData.set(myData);*///获取当前线程的对象以及从对对象里面获得参数MyThreadScopeData myThreadScopeData = MyThreadScopeData.getThreadInstance();myThreadScopeData.setName("name" + data);myThreadScopeData.setAge(data);new A().get();new B().get();}}).start();}}static class A{public void get(){int data = x.get();System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data);/*MyThreadScopeData myData = myThreadScopeData.get();;System.out.println("A from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," +myData.getAge());*/MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();System.out.println("A from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," +myData.getAge());}}static class B{public void get(){int data = x.get();System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data);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 MyThreadScopeData instance = null;//new MyThreadScopeData();//单例的两种方式,饱汉式和恶汉式,一般来说,恶汉式需要同步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 int getAge() {return age;}public void setAge(int age) {this.age = age;}}


 

原创粉丝点击