`

ThreadLocal的使用场合

阅读更多

ThreadLocal的使用场合

Action、Service、Dao各个层需要共享某些参数,而不想各个层间传递参数,可以使用threadlocal保存参数。

 

如果不使用threadlocal对象,或者参数在各个层间进行传递,或者定义一个静态的Map,将当前线程作为key,置入的object作为value。

 

引用http://www.iteye.com/topic/617368

       http://www.iteye.com/topic/103804

 

总之,ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。归纳了两点:
1。每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。
2。将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。

 Java代码 复制代码

  1. package com.meidusa.amoeba.util;   
  2.   
  3. import java.util.HashMap;   
  4. import java.util.Map;   
  5.   
  6. import org.apache.log4j.Logger;   
  7. /**  
  8.  * ThreadLocal Context  
  9.  * @author <a href=mailto:piratebase@sina.com>Struct chen</a>  
  10.  * @version $Id: ThreadLocalContext.java 3597 2006-11-23 08:11:58Z struct $  
  11.  */  
  12. public class ThreadLocalMap{   
  13.     private static Logger logger = Logger.getLogger(ThreadLocalMap.class);   
  14.        
  15.     protected final static ThreadLocal<Map<String,Object>> threadContext = new MapThreadLocal();   
  16.        
  17.     private ThreadLocalMap(){};   
  18.        
  19.     public static void put(String key,Object value){   
  20.         getContextMap().put(key,value);   
  21.     }   
  22.        
  23.     public static Object remove(String key){   
  24.         return getContextMap().remove(key);   
  25.     }   
  26.        
  27.     public static Object get(String key){   
  28.         return getContextMap().get(key);   
  29.     }   
  30.        
  31.     private static class MapThreadLocal extends ThreadLocal<Map<String,Object>> {   
  32.         protected Map<String,Object> initialValue() {   
  33.             return new HashMap<String,Object>() {   
  34.                    
  35.                 private static final long serialVersionUID = 3637958959138295593L;   
  36.                    
  37.                 public Object put(String key, Object value) {   
  38.                     if (logger.isDebugEnabled()) {   
  39.                         if (containsKey(key)) {   
  40.                             logger.debug("Overwritten attribute to thread context: " + key   
  41.                                 + " = " + value);   
  42.                         } else {   
  43.                             logger.debug("Added attribute to thread context: " + key + " = "  
  44.                                 + value);   
  45.                         }   
  46.                     }   
  47.   
  48.                     return super.put(key, value);   
  49.                 }   
  50.             };   
  51.         }   
  52.     }   
  53.        
  54.     /**  
  55.      * 取得thread context Map的实例。  
  56.      *  
  57.      * @return thread context Map的实例  
  58.      */  
  59.     protected static Map<String,Object> getContextMap() {   
  60.         return (Map<String,Object>) threadContext.get();   
  61.     }   
  62.        
  63.        
  64.     /**  
  65.      * 清理线程所有被hold住的对象。以便重用!  
  66.      */  
  67.        
  68.     public static void reset(){   
  69.         getContextMap().clear();   
  70.     }   
  71. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics