java中ThreadLocal的一个应用


前面谈到java中的并发机制的时候谈到ThreadLocal这个类,接下来谈谈这个类的使用,浅谈吧。
这个类包含下面几个方法:
protected T initialValue();
public void set(T value );
public T get();
public void remove();
第一个方法,顾名思义就是初始化ThreadLocal变量对象,系统将为每一个线程调用此方法来获得一个一个对象的copy对象。
第二个方法是对变量对象的设置,改变当前变量对象。
第三个方法是取得变量对象,最后一个是移除变量对象。
我们回到前面谈到的一个问题,为了与数据库通讯,我们需要一个Connection对象,而为了处理事务,我们不希望所有线程共用一个Connection 对象然后用并发机制来约束,毕竟这样带来的性能损失是比较大的,所以我们可以考虑为每一个线程分配一个Connection对象。下面我利用 ThreadLocal来实现这个过程的:
public class DbConnection{
private Connection conn;
{
//do initialization for the conn
}
private ThreadLocal connection = new ThreadLocal(){
private Connection myconn;
protected Connection initialValue(){
//do something with conn
return conn;
}
};
public Connection getConnection(){
return (Connection)connection.get();
}
这是一个非常简单的包装,当使用多线程的时候,在线程初始化的时候就会为每一个线程调用一次initailValue并在get方法中返回一个Connection对象。
当然,这里的这个地方只是一个例子,数据库访问的最好方式还是使用jakarsta下面的一个dbcp中的BasicDataSource来获得,这样更可以提高效率。这里的例子是为了说明ThreadLocal的用处。
官方文档里面用的例子是:
public class SerialNum {
// The next serial number to be assigned
private static int nextSerialNum = 0;

private static ThreadLocal serialNum = new ThreadLocal() {
protected synchronized Object initialValue() {
return new Integer(nextSerialNum++);
}
};

public static int get() {
return ((Integer) (serialNum.get())).intValue();
}
}
这个例子也是比较容易理解的,自己可以做一点test来更加理解这个对象,毕竟,使用它的频率可以根据需求来改变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值