`
haitaohehe
  • 浏览: 13016 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
最近访客 更多访客>>
社区版块
存档分类
最新评论

ThreadLocal模式总结

阅读更多
                     ThreadLocal总结
一、 ThreadLocal简介
ThreadLocal并不能从命名上理解为线程的本地实现版本,因为它并不是一个线程,而是ThreadLocal Variable(线程局部变量)。它的功能非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使得每一个线程都可以独立地改变自己的副本,而不会和其他线程珠副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。

在线程是活动并且ThreadLocal对象是可访问时,该线程就持有一个到该线程局部变量副本的隐含引用。当该线程运行结束后,该线程拥有的所有线程局部变量的副本都将失效,并等待垃圾收集器收集。


二、 ThreadLocal原理
1. 每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。比如起了十个线程,十个线程里面ThreadLoacl里面放的东西是不会共享(相互干扰),线程安全
2. 如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。
3. ThreadLocal只能充当当前线程的Context,线程结束,当前线程中存放的变量也被销毁了,同时我们每次使用完ThreadLocal后,要记得把里面的变量清空。 
4. Thread里面保存了个Map,threadLocal是个map entry key。ThreadLocal的实现决定了这ThreadLocal类的所有的对象,它们的key都不一样,所以可以用来做map entry key。
5. 那么thread local的数据在哪里呢?在Thread对象里,而并不是存放在ThreadLocal中,ThreadLocal只是提供了操作。源码:
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
   注意:ThreadLocalMap的实例是存放在Thread对象中的
   ThreadLocal.ThreadLocalMap threadLocals = null;
而ThreadLocalMap只是ThreadLocal中的一个静态内部类。
三、 ThreadLocal作用
1、 通过ThreadLocal方式封装数据库Connection(省略Web、Service层)


伪代码如下:
/**
* 使用ThreadLocal封装Conection
* @author junxy
*
*/
public class ConnectionManager {

private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();
/**
* 获取数据库链接
* @return conn
*/
public static Connection getConn(){
Connection conn = connectionHolder.get();
if(conn==null){
//1.获取数据库链接
//2.设置到ThreadLocal中
connectionHolder.set(conn);
}
return conn;
}
/**
* 关闭数据库链接
*/
public static void closeConn(){
Connection conn = connectionHolder.get();
if(conn!=null){
//1.关闭数据库练级
//2.清空ThreadLocal中链接  切记!
connectionHolder.remove();
}
}
}
2、多线程环境下共享资源的传递

  

参考了网上不少文章,在此感谢下,呵呵 ,还未写完,先保存着。。。。

转载一篇文章:http://blog.painiu.com/2010/11/2233.html
  • 大小: 21.3 KB
  • 大小: 31.5 KB
分享到:
评论

相关推荐

    设计模式及ThreadLocal资料

    总结一下,这份资料涵盖了设计模式中的单例模式、工厂模式和代理模式,以及Java中的ThreadLocal特性。理解并熟练应用这些概念和技术,对于提升Java开发者的技能水平,优化代码的可读性和可维护性具有重要作用。在...

    正确理解ThreadLocal.pdf

    这种设计模式避免了在多线程环境中直接操作共享资源可能带来的线程安全问题。 #### 四、ThreadLocal的生命周期与内存管理 值得注意的是,`ThreadLocal`变量的生命周期与线程的生命周期紧密关联。当线程结束时,与...

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

    总结起来,ThreadLocal和Spring的事务管理是Java开发中解决并发问题和保证数据一致性的重要手段。熟练掌握这两个概念,有助于构建稳定、高效的分布式系统。通过深入学习源码和实际应用,我们可以更好地理解其工作...

    ThreadLocal和事务

    总结来说,这个小型练习展示了如何在Java Web应用中有效地结合c3p0数据源、ThreadLocal和事务管理,以实现安全、高效的转账操作。ThreadLocal提供了线程安全的变量管理,c3p0优化了数据库连接的使用,而事务则保证了...

    深入理解 Java 之 ThreadLocal 工作原理1

    总结起来,ThreadLocal的核心是通过每个线程内部的ThreadLocalMap来实现变量的线程隔离。它简化了线程安全的处理,允许在多线程环境中为每个线程提供独立的变量副本,而无需同步。理解和掌握ThreadLocal的工作原理...

    Hibernager_Session_Manager_ThreadLocal

    5. **事务管理**:在使用ThreadLocal的模式下,事务管理通常与Session绑定。每个线程内的操作在同一个Session中进行,方便控制事务边界。 6. **性能优化**:ThreadLocal提供了一种高效的Session管理方式,避免了...

    ThreadLocal,你真的了解吗?

    总结,ThreadLocal 提供了一种线程隔离的变量存储方式,而 Java 中的四种引用类型则帮助我们更好地控制对象的生命周期和内存管理,理解这些概念对于理解和使用 ThreadLocal 至关重要,同时也是面试中经常考察的知识...

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    总结来说,单例模式在进程内保证对象的唯一性,但在分布式环境中需要额外的策略来实现跨进程的唯一性。线程唯一的单例则关注于在单个线程内的对象唯一,允许不同线程拥有各自的实例。在实际应用中,应根据系统的需求...

    第03章 从架构层面看设计模式02.pdf

    总结来说,本章节通过具体的电商场景,深入解析了设计模式在架构层面的应用,展示了如何利用这些模式解决实际问题,提高系统的可扩展性、可维护性和灵活性。通过代理模式实现文件服务的分布式管理,通过策略模式简化...

    java事务 - 模板设计模式

    总结来说,Java事务模板设计模式结合ThreadLocal,提供了一种高效、健壮的事务管理策略。它减少了代码的重复性,提高了代码的可读性和可维护性,同时通过ThreadLocal解决了并发环境下的事务隔离问题。理解并熟练应用...

    java 反模式 卷1 pdf

    书中的反模式是通过对实践中出现问题的总结,提炼出的不良设计或编程习惯,通过分析这些反模式,我们可以更清晰地认识到问题的本质,从而采取正确的解决方案。 Java反模式涵盖了许多主题,包括对象设计、类设计、...

    自己总结的多线程

    - **线程局部变量**:通过`ThreadLocal`类来隔离不同线程中的变量副本,从而避免线程安全问题。 ### 总结 本文从多线程的基础概念出发,深入探讨了Java中多线程的实现机制及线程安全问题,并介绍了几种常见的设计...

    JAVA多线程设计模式详解

    8. 线程局部变量模式:ThreadLocal类提供线程私有的变量,避免多线程环境中的数据共享问题。 9. 死锁避免模式:通过合理设计资源获取顺序和超时策略,防止死锁的发生。 10. 可中断线程模式:线程在执行过程中可以被...

    java多线程_设计模式_各种技术(我的书架)

    其次,设计模式是解决软件设计中常见问题的经验总结。在Java中,有23种经典设计模式,分为三大类:创建型、结构型和行为型。例如,工厂模式提供了一种创建对象的方式,而单例模式确保一个类只有一个实例。适配器模式...

    dao设计模式DAO 设计模式之事务界定疯.pdf

    #### 六、总结 通过使用一个专门的工具类来处理事务,可以显著提高系统的稳定性和可维护性。这种方法不仅简化了DAO层的设计,而且还可以减少出错的可能性。对于大型的应用程序来说,这样的设计尤其重要,因为它可以...

    Java jdbc三层及事务(转账案例)

    此外,我们还会涉及单例模式和ThreadLocal在实际应用中的使用。 首先,三层架构是软件设计中常用的一种架构模式,主要分为表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data ...

    Java面试总结~~~~.docx

    【Java面试总结】 Java面试是检验开发者技能和知识深度的重要环节。面试中,面试官通常会从以下几个方面来考察候选人的能力: 1. **基础知识**: - 面试题通常涵盖Java的基础语法,如数据类型、控制结构、异常...

    java面试常见问题总结

    - **概念**:ThreadLocal是一种线程局部变量的设计模式,它可以为每个线程提供一个独立的变量副本,这样每个线程都可以独立地修改其副本而不影响其他线程。 - **内部实现**:ThreadLocal类内部维护了一个HashMap类型...

    基于Hibernate的数据持久层关键技术的研究

    2. **ThreadLocal模式**:在多线程环境下,使用ThreadLocal来管理Hibernate的Session可以避免线程安全问题。每个线程都有自己的Session实例,这样可以确保数据访问的线程安全性。 3. **静态工厂方法**:为了提高...

    java线程安全总结.doc

    以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一块代码时,如果每个线程都能得到预期的结果,且不产生数据不一致或同步问题,那么这块代码就被称为线程安全的。Java中的...

Global site tag (gtag.js) - Google Analytics