ThreadLocal杂谈

用过Spring的可能都知道,Spring将Dao层的JavaBean可以设置成Singleton并生成这个Singleton的实例。但是Singleton的JavaBean应该是无状态的(另外的一个意思就是这个JavaBean是线程安全的),但是数据库操作是有状态的,比如Connection对象就是有状态的,应该对于每个执行数据库操作的每个线程都有一个Connection对象。那如何用Singleton实例实现线程安全呢。答案就是ThreadLcoal。
ThreadLcoal是从JDK1.2被引入的。ThreadLcoal它不是线程,而是线程的一个本地化对象。当工作于多线程的对象使用ThreadLcoal维护变量时,ThreadLcoal会为每个使用该变量的线程分配一个独立的变量副本,所以每一个线程都可以独立改变自己的副本,而不会影响其他的线程。
那么ThreadLcoal是如何实现上述工作的呢,ThreadLocal中维护了一个map结构,该map结构的key是当前线程,value值是对应线程的变量副本。照着这个意思,也可以实现自己的一个ThreadLcoal。ThreadLcoal中主要的方法有一下几个,set方法,get方法 remove方法 initialValue方法。相信看了以下ThreadLcoal的简单实现,这些代码的意思也就不难理解了。
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class MyThreadLocal {
private Map valueMap= Collections.synchronizedMap(new HashMap());
public void set(Object newValue){
valueMap.put(Thread.currentThread(), newValue);
}
public Object get(){
Thread currentThread=Thread.currentThread();
Object o= valueMap.get(currentThread);
if(null==o&&!valueMap.containsKey(currentThread)){
o=initalValue();
valueMap.put(currentThread, o);
}
return o;
}
public void remove(){
valueMap.remove(Thread.currentThread());
}
public Object initalValue(){
return null;
}
}

那么ThreadLocal与传统的线程同步机制有什么不同点呢?
1、ThreadLocal以空间换时间,利用为每一个线程都维护一个非线程安全的变量的一个副本实现并发的目的,用空间的增加来换取快速的处理时间。
2、传统的线程同步机制正好相反,是利用时间来换取空间,通过多个线程只维护一个非线程安全的变量,通过对该变量进行访问控制(例如synchronized)来实现线程安全,空间利用的少,但是处理时间也相应的长了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值