`
haitaohehe
  • 浏览: 12690 次
  • 性别: 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
分享到:
评论

相关推荐

    java单例模式看这一篇就够了

    深入分析java单例模式什么是单例模式单例模式的常见写法一、饿汉式单例优点缺点示例二、懒汉式单例示例1(普通写法)示例2(synchronized写法)示例3(DCL写法)示例4(内部类写法)三、注册式单例示例1(容器式)示例2(枚举式...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段28讲、使用ThreadLocal重新实现一个上下文设计模式.mp4 │ 高并发编程第二阶段29讲、多线程Balking设计模式-上.mp4 │ 高并发编程第二阶段30讲、多线程Balking设计模式-下.mp4 │ 高并发...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段28讲、使用ThreadLocal重新实现一个上下文设计模式.mp4 │ 高并发编程第二阶段29讲、多线程Balking设计模式-上.mp4 │ 高并发编程第二阶段30讲、多线程Balking设计模式-下.mp4 │ 高并发...

    Wws_Android_Interview

    面向的复习计划以及相关知识点的总结 预计:1个半月 目录 Java基础:(每周改为三天1.20-12.22)(每周1.20-1.27) 面向对象的特性 集合类 并发(synchroinzed锁机制参考Hencoder Plus?线程安全的集合类) 增加项目...

    Java并发编程原理与实战

    Future设计模式实现(实现类似于JDK提供的Future).mp4 Future源码解读.mp4 ForkJoin框架详解.mp4 同步容器与并发容器.mp4 并发容器CopyOnWriteArrayList原理与使用.mp4 并发容器ConcurrentLinkedQueue原理与使用....

    龙果 java并发编程原理实战

    第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器...

    Java 并发编程原理与实战视频

    第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器...

    龙果java并发编程完整视频

    第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器...

    java并发编程

    第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器...

    Java学习笔记-个人整理的

    {1.3.1}总结}{23}{subsection.1.3.1} {1.4}数据类型}{23}{section.1.4} {1.4.1}整数与浮点数}{23}{subsection.1.4.1} {1.4.1.1}浮点数原理}{24}{subsubsection.1.4.1.1} {1.4.2}格式化输出浮点数}{24}{...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【线程】ThreadLocal的作用 90 【Spring】什么是IOC和DI?DI是如何实现的 91 【Spring】spring中的IOC(控制反转)的原理 92 【Spring】什么是AOP 92 【Spring】Spring事务机制 93 声明式事物 93 编程式事务 94 ...

    java面试题以及技巧

    │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java.htm │ │ │ SCJP 1_4 认证的初级教程.htm │ │ │ 新建 文本文档....

    java面试题目与技巧1

    │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java.htm │ │ │ SCJP 1_4 认证的初级教程.htm │ │ │ 新建 文本文档....

    java面试题及技巧4

    │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java.htm │ │ │ SCJP 1_4 认证的初级教程.htm │ │ │ 新建 文本文档....

    java面试题及技巧3

    │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java.htm │ │ │ SCJP 1_4 认证的初级教程.htm │ │ │ 新建 文本文档....

    java面试题以及技巧6

    │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java.htm │ │ │ SCJP 1_4 认证的初级教程.htm │ │ │ 新建 文本文档....

    Spring中文帮助文档

    11.1.1. 选择一种工作模式 11.1.2. Spring JDBC包结构 11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 ...

Global site tag (gtag.js) - Google Analytics