`

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

相关推荐

    ThreadLocal应用示例及理解

    ### ThreadLocal基本使用 创建ThreadLocal实例时,通常会定义一个泛型参数,代表该线程局部变量的类型。例如: ```java ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal(); ``` ### 设置和获取值 在...

    java中ThreadLocal类的使用

    下面我们将深入探讨`ThreadLocal`的工作原理、使用场景以及常见误区。 `ThreadLocal`类的主要方法有以下几个: 1. `void set(T value)`:设置当前线程的线程局部变量的值。 2. `T get()`:返回当前线程的线程局部...

    ThreadLocal

    ThreadLocal通常被用来解决线程共享数据时可能出现的并发问题,避免了使用synchronized关键字进行同步控制的复杂性。 在Java中,ThreadLocal的工作原理是为每个线程创建一个单独的存储空间,每个线程可以独立地读写...

    Spring事务处理-ThreadLocal的使用

    本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及如何通过源码理解和应用这个工具。 首先,了解Spring事务管理的基本概念。在多线程环境中,事务管理是至关重要的,它负责确保一组数据库操作要么全部成功...

    ThreadLocal简单Demo

    4. **减少锁的使用**: 当多个线程需要共享同一资源,但每个线程只需要读取自己相关的数据时,`ThreadLocal`可以避免锁的使用,提升效率。 **注意事项** - 使用`ThreadLocal`后,应确保及时清理不再使用的变量,...

    从ThreadLocal的使用到Spring的事务管理

    本文将深入探讨ThreadLocal的使用以及Spring框架中的事务管理,这两个主题都是Java开发人员必须掌握的关键技能。 首先,让我们了解ThreadLocal。ThreadLocal是Java提供的一种线程绑定变量的工具类,它允许我们在一...

    使用ThreadLocal管理“session”数据

    ThreadLocal内部使用了一个ThreadLocalMap,它是一个基于ThreadLocal实例作为键,值为用户存储对象的弱引用表。每个线程都有一个这样的ThreadLocalMap,保证了线程间数据的隔离。 6. **工具支持** 在实际开发中,...

    Java中ThreadLocal的设计与使用

    理解ThreadLocal的工作原理和使用方法对于编写高效、安全的多线程程序至关重要。 ### ThreadLocal简介 ThreadLocal并非一个线程对象,而是一个线程局部变量的容器。每个线程都有自己的ThreadLocal实例,它们各自...

    ThreadLocal的使用

    NULL 博文链接:https://xuranpaoche.iteye.com/blog/1514071

    ThreadLocal的几种误区

    然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将详细探讨这些常见的误解。 误区一:ThreadLocal是Java线程的一个实现 ThreadLocal并非Java线程的实现,它只是一个工具类,用于创建线程局部变量。...

    JDK的ThreadLocal理解(一)使用和测试

    **标题:“JDK的ThreadLocal理解(一)使用和测试”** **正文:** ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个...

    java事务 - threadlocal

    当Java事务与ThreadLocal结合使用时,可以在不同的线程中维护各自的事务状态,比如在Spring框架中,每个线程的ThreadLocal可以存储一个TransactionStatus对象,这样就可以在线程内部管理当前事务的状态,而不会影响...

    ThreadLocal 内存泄露的实例分析1

    在描述的案例中,`LeakingServlet` 是一个使用了 `ThreadLocal` 的 Servlet。`ThreadLocal` 是 Java 中用于在单个线程内存储线程局部变量的类,每个线程都有自己的副本,不会互相干扰。`MyThreadLocal` 是 `...

    java 简单的ThreadLocal示例

    **ThreadLocal的使用方法:** 1. **创建ThreadLocal实例:** 首先,你需要创建一个ThreadLocal类型的实例,这将作为你在每个线程中存储值的容器。 ```java ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal();...

    threadLocal

    因此,正确使用`ThreadLocal`的一个关键点是在线程结束或不再使用ThreadLocal时,及时调用`remove()`。 工具应用: 在实际开发中,ThreadLocal常用于缓存线程相关的数据,如数据库连接、事务管理、请求上下文等。...

    正确理解ThreadLocal.pdf

    `ThreadLocal`是Java平台提供的一种线程局部变量的解决方案,它为每一个使用该变量的线程都提供了独立的变量副本,使得每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。这不同于普通的静态...

    java中ThreadLocal详解

    需要注意的是,尽管使用了弱引用来避免内存泄漏,但仍需谨慎管理`ThreadLocal`实例的生命周期,确保及时释放不再使用的资源。此外,`ThreadLocalMap`通过开放地址法来解决哈希冲突,进一步提高了性能并减少了内存...

    ThreadLocal源码分析和使用

    ThreadLocal 源码分析和使用 ThreadLocal 是 Java 语言中的一种多线程编程机制,用于解决多线程程序的并发问题。它不是一个 Thread,而是一个 Thread 的局部变量。ThreadLocal 的出现是为了解决多线程程序中的共享...

Global site tag (gtag.js) - Google Analytics