ThreadLocal实现线程范围内数据共享

线程范围内数据共享的作用和目的见我的上一篇文章。
ThreadLocal其实就是相当于Map,可以set和get就好了。

package martina.TraditionalThread;

import java.util.Random;

public class ThreadLocalTest {
    static ThreadLocal<Integer> threadLocal=new ThreadLocal<Integer>();
    public static void main(String[] args){
        new ThreadLocalTest().init();

    }
    public  void init(){
        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 set data:"+data);
                    threadLocal.set(data);
                    A.get();
                    B.get();
                }
            }).start();
        }
    }

    static class A{
        public static  void get(){
            int data=threadLocal.get();
            System.out.println(Thread.currentThread().getName()+"'s A get data:"+data);
        }

    }
    static class B{
        public static void get(){
            int data=threadLocal.get();
            System.out.println(Thread.currentThread().getName()+"'s B get data:"+data);
        }

    }

}

运行结果如下:
在这里插入图片描述
用一个类实现线程范围内多个数据的共享。
资源类:

class TestThreadScopeData{
    private TestThreadScopeData(){}
    private static TestThreadScopeData instance=null;
    private static ThreadLocal<TestThreadScopeData> map=new ThreadLocal<TestThreadScopeData>();
    /**
     * 这里就不需要用到Synchronized
     * 自己可以想一下是否会有两个进程进入该方法来判断是否需要实现互斥(加锁)
     * @return
     */
    public static TestThreadScopeData getInstance(){
        instance=map.get();
        if(instance == null){
            instance=new TestThreadScopeData();
            map.set(instance);
        }
        return instance;
    }
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

入口类:

public class ThreadLocalTest {
    static ThreadLocal<Integer> threadLocal=new ThreadLocal<Integer>();
    public static void main(String[] args){
        new ThreadLocalTest().init();

    }
    public  void init(){
        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 set data:"+data);
                   // threadLocal.set(data);
                    TestThreadScopeData.getInstance().setAge(data);
                    TestThreadScopeData.getInstance().setName(Thread.currentThread().getName()+data);
                    A.get();
                    B.get();
                }
            }).start();
        }
    }

    static class A{
        public static  void get(){
          /*  int data=threadLocal.get();
            System.out.println(Thread.currentThread().getName()+"'s A get data:"+data);*/
            TestThreadScopeData myData=TestThreadScopeData.getInstance();
            System.out.println(Thread.currentThread().getName()+"'s A get data:"+myData.getAge()+" name:"+myData.getName());
        }

    }
    static class B{
        public static void get(){
         /*   int data=threadLocal.get();
            System.out.println(Thread.currentThread().getName()+"'s B get data:"+data);*/
            TestThreadScopeData myData=TestThreadScopeData.getInstance();
            System.out.println(Thread.currentThread().getName()+
                    "'s B get data:"+myData.getAge()+" name:"+myData.getName());
        }
    }
}

实验结果如下:
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mulinsen77/article/details/84345348