多线程和并发库应用六-ThreadLocal

19 篇文章 0 订阅
15 篇文章 0 订阅

上文中使用一个hashmap 来实现线程间的数据共享其实jdk 已经实现了一个这样的类ThreadLocal
于是上节中的代码可以改成这样

public class ThreadScopShareData {
    public static int data=0;
    static ThreadLocal<Integer> map=new ThreadLocal<Integer>();
    public static void main(String[] args){
        for (int i=0;i<2;i++)
        new Thread(new Runnable() {
            public void run() {
                data=new Random().nextInt();
                map.set(data);
                System.out.println(Thread.currentThread().getName()+" has put data: "+data);
                new A().get();
                new B().get();
            }
        }).start();
    }
    static  class A{
        public int get(){
            System.out.println(Thread.currentThread().getName()+" has A get data: "+map.get());
            return map.get();
        }
    }
    static  class B{
        public int get(){
            System.out.println(Thread.currentThread().getName()+" has B get data: "+map.get());
            return map.get();
        }
    }
}
Thread-0 has put data: -1169176914
Thread-1 has put data: 270415151
Thread-0 has A get data: -1169176914
Thread-1 has A get data: 270415151
Thread-1 has B get data: 270415151
Thread-0 has B get data: -1169176914

我们将他重新构造一下

public class ThreadScopShareDataThreadLocal {
    public static void main(String[] args){
        for (int i=0;i<2;i++)
        new Thread(new Runnable() {
            public void run() {
               Data data=Data.getInstance();
                data.setAge(new Random().nextInt());
                data.setName(Thread.currentThread().getName());
                System.out.println(Thread.currentThread().getName()+" has put data: "+data.toString());
                new A().get();
                new B().get();
            }
        }).start();
    }
    static  class A{
        public void get(){
            System.out.println(Thread.currentThread().getName()+" has A get data: "+Data.getInstance().toString());
        }
    }
    static  class B{
        public void get(){
            System.out.println(Thread.currentThread().getName()+" has B get data: "+Data.getInstance().toString());
        }
    }

}
  class Data{
    private Data(){};
    public static synchronized  Data getInstance(){
        Data instance=map.get();
        if(instance==null){
            instance =new Data();
            map.set(instance);
        }
        return instance;
    }
    // private static Data instance =null;
    private static  ThreadLocal<Data> map=new ThreadLocal<Data>();
    private String name ;

    public int getAge() {
        return age;
    }

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

    private int age;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Data{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

文章地址:http://www.haha174.top/article/details/251958
项目源码:https://github.com/haha174/thread-learning.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值