- 浏览: 162794 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (90)
- 敏捷 (0)
- 领域驱动设计 (1)
- 设计模式与重构 (4)
- Spring (4)
- IBatis (1)
- Ext (3)
- JavaScript (2)
- Oracle (7)
- DB2 (0)
- SQL基础及优化 (8)
- 数据库基础知识 (2)
- 感悟 (4)
- 网络 (1)
- Java基础 (11)
- weblogic (2)
- websphere (0)
- OSWorkFlow (4)
- 报表 (2)
- ETL (3)
- 笔试面试 (1)
- Struts2 (0)
- Servlet (2)
- UML (2)
- CSS (0)
- Acegi (0)
- TDD (0)
- 项目管理 (0)
- 系统设计 (1)
- 数据仓库 (1)
- Tomcat (2)
- DWR (1)
- GreenPlum (1)
- MySQL (1)
- 开发环境 (2)
- POI (1)
- Java综合 (3)
- 行业思考 (1)
- 札记 (0)
- English (1)
- 工具 (0)
- Shell (2)
- JQuery (3)
- JMS (1)
- JVM (1)
最新评论
-
南京玄武:
谢谢~ 这个也是你吗?http://www.codeweblo ...
P6Spy not Suitable Driver -
longzw:
问一下,怎么创建表空间的,在greenPlum我这里是装在虚拟 ...
GreenPlum AdminGuide 阅读笔记 -
softctwo:
还有p6spy不能过滤result的输出,sql查询的结果集都 ...
P6Spy not Suitable Driver -
jamesji:
Cognos 的产品除了好看以外,垃圾的地方很多。建议直接使用 ...
2个web应用集成问题解决 -
kanny87929:
你说了半天不知道你在说什么
保险公司IT部门的环境待遇问题
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()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。
1。每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。
2。将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。
- package com.meidusa.amoeba.util;
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.log4j.Logger;
- /**
- * ThreadLocal Context
- * @author <a href=mailto:piratebase@sina.com>Struct chen</a>
- * @version $Id: ThreadLocalContext.java 3597 2006-11-23 08:11:58Z struct $
- */
- public class ThreadLocalMap{
- private static Logger logger = Logger.getLogger(ThreadLocalMap.class);
- protected final static ThreadLocal<Map<String,Object>> threadContext = new MapThreadLocal();
- private ThreadLocalMap(){};
- public static void put(String key,Object value){
- getContextMap().put(key,value);
- }
- public static Object remove(String key){
- return getContextMap().remove(key);
- }
- public static Object get(String key){
- return getContextMap().get(key);
- }
- private static class MapThreadLocal extends ThreadLocal<Map<String,Object>> {
- protected Map<String,Object> initialValue() {
- return new HashMap<String,Object>() {
- private static final long serialVersionUID = 3637958959138295593L;
- public Object put(String key, Object value) {
- if (logger.isDebugEnabled()) {
- if (containsKey(key)) {
- logger.debug("Overwritten attribute to thread context: " + key
- + " = " + value);
- } else {
- logger.debug("Added attribute to thread context: " + key + " = "
- + value);
- }
- }
- return super.put(key, value);
- }
- };
- }
- }
- /**
- * 取得thread context Map的实例。
- *
- * @return thread context Map的实例
- */
- protected static Map<String,Object> getContextMap() {
- return (Map<String,Object>) threadContext.get();
- }
- /**
- * 清理线程所有被hold住的对象。以便重用!
- */
- public static void reset(){
- getContextMap().clear();
- }
- }
发表评论
-
Java基础-泛型
2011-08-12 16:58 1131泛型和序列化??? ... -
Java基础-访问控制
2011-08-03 16:51 8361、static的 final的 private 都不能和ab ... -
Java基础-数组
2011-08-03 16:29 6321、数组的声明 int[5];//error 声明、 ... -
Java基础-基本类型及关键字
2011-08-03 14:00 994int x=253,34 //error char ... -
Integer不能作为synchronized的对象吗
2011-07-20 10:25 1075public class SychronizedTest ... -
可重入锁的几个疑问
2011-07-20 10:22 15941、被争夺的公平锁要比不公平锁的吞吐率更低吗?? 是的 ... -
一次JVM调优实验(java分布式应用札记)
2011-03-27 21:57 1086package com.google.prophet.quic ... -
读书笔记20110303
2011-03-03 22:41 0原型继承的方式,自身然后原型然后父类的原型 原型为父类 ... -
读书札记20110227
2011-02-27 13:30 0Double、String是final类 Intege ... -
对称加密和非对称加密的区别
2011-02-26 23:10 0对称加密就是加密和解密的密钥是同一个,非对称加密不是同一个 -
一些jar包的作用
2010-11-29 22:20 918commons-digesterDigester基于 ... -
Java集合常见问题探讨
2010-09-18 15:08 11351、LinkedHashMap 与HashMap比较 Has ... -
什么是javabean
2010-08-02 23:51 01、具有符合规范的get、set方法 2、具有无参数的 ... -
对线程安全的理解
2010-07-23 11:18 1242方法也有同步一说,对象也有同步一说。本质上同步的就是对象。 ... -
几个基础知识点
2010-06-25 22:42 01、如何替换第一次出现的字符串 System.out.pri ... -
JasperReport的使用
2010-05-10 20:29 0前一个项目用的是birt问题不少。 1、查询显示速度慢 ... -
Java内存泄露
2010-04-25 22:23 0Java没有真正的内存泄露,只是内存没有释放,但是是一个无用的 ... -
Java集合常见问题探讨
2010-04-25 22:17 01、LinkedList、ArrayList、Vector ... -
ConcurrentHashMap分析
2010-04-25 22:08 0关键字: concurrenthashmap原理分析 ... -
Java对象的序列化和反序列化实践
2010-04-25 22:07 02007-09-19 09:01作者:佚名出处:论坛整理 ...
相关推荐
ThreadLocal为每个线程提供独立的变量副本,避免了共享数据的冲突,但过度使用可能导致内存泄漏(OOM)。 【JVM相关】 JVM内存模型分为堆、栈、方法区、程序计数器、本地方法栈等区域。GC(Garbage Collection)...
理解并适度使用反射,可以在某些场合实现灵活的编程。 7. **设计模式**:Java中的常见设计模式如工厂模式、单例模式、观察者模式等,是解决特定问题的模板。熟悉并能灵活运用这些模式,能写出更优雅、可维护的代码...
通常情况下,`double` 类型比 `float` 类型更精确,因此在精度要求较高的场合下一般使用 `double`。 - **变量声明**:变量声明是指定义一个变量,包括指定变量的名称和类型。例如,在这行代码中,`float f` 就是...
- 利用Spring提供的ThreadLocal实现线程安全。 **问题十三:为什么要有事物传播行为?** - 为了确保在嵌套事务中正确处理事务边界,避免出现脏读等问题。 **问题十四:介绍一下Spring的事物管理** - **编程式...
ThreadLocalRandom类通过使用ThreadLocal变量来存储每个线程的私有Random实例,确保了在多线程环境下的独立性。每个线程都有自己的种子,不会因其他线程的影响而产生重复的随机数。ThreadLocalRandom不仅解决了并发...
- `newCachedThreadPool`: 可缓存的线程池,适用于执行大量的短期异步任务的场合。 - `newSingleThreadExecutor`: 单线程化的线程池,确保所有任务都在同一个线程中执行。 - `newScheduledThreadPool`: 定期执行...
- 应用场景:多线程环境、安全性要求高的场合等。 #### 3. 文件系统操作 - **文件操作**:包括创建、删除、重命名文件或目录等。 - **路径处理**:路径的获取、规范化等操作。 - **输入输出流**:如FileInputStream...
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................