线程内部共享变量(ThreadLocal类使用初步)

线程内部共享变量的应用背景介绍:

以转账为例,对于同一个转账系统,当有多个线程访问的时候,我们需要为这些线程提供数据库连接(connection),显然此时的connection是线程内共享的。因为,一个单独的线程对应一个用户,当对某个用户的服务完成之后,数据库连接关闭,如果数据库连接线程共享,毫无疑问,此时会对正在转账的其他用户产生影响。

一个线程可以对应多个ThreadLocal对象;

关于ThreadLocal类我会在源码解析系列中做更详细的分析。

下面这个程序是在学习了张孝祥老师的多线程之后自己又敲的一个:

import java.util.Random;

public class ShareDataInThread
{

    public static void main(String[] args)
    {
        for (int i = 0; i < 2; i++)
        {
            new Thread(new Runnable()
            {

                @Override
                public void run()
                {
                    // TODO Auto-generated method stub

                    int age = new Random().nextInt();
                    useSaveData data = useSaveData.getThreadLocalInstance();
                    System.out.println(Thread.currentThread().getName() 
                            + " has put data :" + age);
                    data.setAge(age);
                    data.setName(""+age);
                    new A().get();
                    new B().get();
                }
            }).start();
        }
    }

    static class A
    {
        public void get()
        {
            useSaveData data = useSaveData.getThreadLocalInstance();
            String name = data.getName();
            int age = data.getAge();
            System.out.println("A from " + Thread.currentThread().getName() + "     age:" + age);
        }

    }

    static class B
    {
        public void get()
        {
            useSaveData data = useSaveData.getThreadLocalInstance();
            String name = data.getName();
            int age = data.getAge();
            System.out.println("B from " + Thread.currentThread().getName()+ "     age:" + age);
        }
    }
}

class useSaveData
{
    private static ThreadLocal<useSaveData> map = new ThreadLocal<>();

    public static useSaveData getThreadLocalInstance()
    {
        useSaveData instance = map.get();
        if (instance == null)
        {
            instance = new useSaveData();
            map.set(instance);
        }

        return instance;

    }

    private useSaveData()
    {

    }

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

在敲程序的过程中得到的收获:

  • 第一是单例模式,以后我会专门开个设计模式的专栏来学习一下设计模式。
  • 而是写程序的时候最好要分层写,主要业务逻辑和次要业务逻辑分清楚,这样写出来的代码也会更好更清晰。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值