关于spring中dao层单例模式及ThreadLocal的有关问题
关于spring中dao层单例模式及ThreadLocal的问题
在spring框架中,dao层采用单例模式,出于考虑到线程安全问题使用ThreadLocal来为每个线程保存dao实例的副本,在做操作时各线程之间不会相互影响。
问题1:既然dao层是单例模式,获取dao层的单例A被放入了线程的ThreadLocal中,那么每个线程取出来的实例A不还是同一个实例吗?哪里有创建了副本的操作?
------解决思路----------------------
ThreadLocal内部机制会复制对象,不会是同一个。
另外,Dao、service一般都是直接调用他们的方法,并不会存在共用的数据,所以不会存在线程安全问题。而Struts2的Action如果是单例,肯定是有线程安全问题的
------解决思路----------------------
需要自己实现这个方法,创建不同的对象就可以了,默认返回的是 null
------解决思路----------------------
既然是单例为啥还要用这个ThreadLocal
在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不还是同一个实例吗?哪里有创建了副本的操作?
------解决思路----------------------
ThreadLocal内部机制会复制对象,不会是同一个。
另外,Dao、service一般都是直接调用他们的方法,并不会存在共用的数据,所以不会存在线程安全问题。而Struts2的Action如果是单例,肯定是有线程安全问题的
------解决思路----------------------
public Object initialValue() {
return null;
}
需要自己实现这个方法,创建不同的对象就可以了,默认返回的是 null
------解决思路----------------------
既然是单例为啥还要用这个ThreadLocal