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

来源:互联网 发布:7.1声道测试软件 编辑:程序博客网 时间:2024/06/13 02:04

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

以转账为例,对于同一个转账系统,当有多个线程访问的时候,我们需要为这些线程提供数据库连接(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
原创粉丝点击