`

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. }
分享到:
评论

相关推荐

    大厂必学BAT面试题汇总及详解

    ThreadLocal为每个线程提供独立的变量副本,避免了共享数据的冲突,但过度使用可能导致内存泄漏(OOM)。 【JVM相关】 JVM内存模型分为堆、栈、方法区、程序计数器、本地方法栈等区域。GC(Garbage Collection)...

    Java避坑指南:Java高手笔记代码篇.rar

    理解并适度使用反射,可以在某些场合实现灵活的编程。 7. **设计模式**:Java中的常见设计模式如工厂模式、单例模式、观察者模式等,是解决特定问题的模板。熟悉并能灵活运用这些模式,能写出更优雅、可维护的代码...

    JAVA经典笔试题目

    通常情况下,`double` 类型比 `float` 类型更精确,因此在精度要求较高的场合下一般使用 `double`。 - **变量声明**:变量声明是指定义一个变量,包括指定变量的名称和类型。例如,在这行代码中,`float f` 就是...

    Java面试框架高频问题2019

    - 利用Spring提供的ThreadLocal实现线程安全。 **问题十三:为什么要有事物传播行为?** - 为了确保在嵌套事务中正确处理事务边界,避免出现脏读等问题。 **问题十四:介绍一下Spring的事物管理** - **编程式...

    深入浅析Random类在高并发下的缺陷及JUC对其的优化

    ThreadLocalRandom类通过使用ThreadLocal变量来存储每个线程的私有Random实例,确保了在多线程环境下的独立性。每个线程都有自己的种子,不会因其他线程的影响而产生重复的随机数。ThreadLocalRandom不仅解决了并发...

    java超有用的面试题目

    - `newCachedThreadPool`: 可缓存的线程池,适用于执行大量的短期异步任务的场合。 - `newSingleThreadExecutor`: 单线程化的线程池,确保所有任务都在同一个线程中执行。 - `newScheduledThreadPool`: 定期执行...

    顶级IT公司面试题

    - 应用场景:多线程环境、安全性要求高的场合等。 #### 3. 文件系统操作 - **文件操作**:包括创建、删除、重命名文件或目录等。 - **路径处理**:路径的获取、规范化等操作。 - **输入输出流**:如FileInputStream...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics