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

关于spring中dao层单例模式及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