线程内部共享变量的应用背景介绍:
以转账为例,对于同一个转账系统,当有多个线程访问的时候,我们需要为这些线程提供数据库连接(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;
}
}
在敲程序的过程中得到的收获:
- 第一是单例模式,以后我会专门开个设计模式的专栏来学习一下设计模式。
- 而是写程序的时候最好要分层写,主要业务逻辑和次要业务逻辑分清楚,这样写出来的代码也会更好更清晰。