关于spring中dao层单例模式及ThreadLocal的问题

xiang_翔 2015-06-29 04:57:06
在spring框架中,dao层采用单例模式,出于考虑到线程安全问题使用ThreadLocal来为每个线程保存dao实例的副本,在做操作时各线程之间不会相互影响。

public class SimpleThreadLocal {   
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 (o == null && !valueMap.containsKey(currentThread)) {//③如果在Map中不存在,放到Map 中保存起来。
o = initialValue();
valueMap.put(currentThread, o);
}
return o;
}
public void remove() {
valueMap.remove(Thread.currentThread());
}
public Object initialValue() {
return null;
}
}


问题1:既然dao层是单例模式,获取dao层的单例A被放入了线程的ThreadLocal中,那么每个线程取出来的实例A不还是同一个实例吗?哪里有创建了副本的操作?
...全文
439 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
scmod 2015-06-30
  • 打赏
  • 举报
回复
既然是单例为啥还要用这个ThreadLocal
Inhibitory 2015-06-30
  • 打赏
  • 举报
回复
     public Object initialValue() {   
          return null;   
     } 
需要自己实现这个方法,创建不同的对象就可以了,默认返回的是 null
finemi 2015-06-29
  • 打赏
  • 举报
回复
ThreadLocal内部机制会复制对象,不会是同一个。 另外,Dao、service一般都是直接调用他们的方法,并不会存在共用的数据,所以不会存在线程安全问题。而Struts2的Action如果是单例,肯定是有线程安全问题的

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧