ThreadLocal解析



ThreadLocal

如果定义了一个单实例的java bean,它有若干属性,但是有一个属性不是线程安全的,比如说HashMap。并且碰巧你并不需要在不同的线程中共享这个属性,也就是说这个属性不存在跨线程的意义。那么不推荐使用sychronize,可使用ThreadLocal

关键代码如下:

package cn.happy.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class ThreadUtil {
        // 初始化一个ThreadLocal对象
        private static final ThreadLocal sessionTL = new ThreadLocal();
        private static Configuration configuration;
        private final static SessionFactory sessionFactory;
        static {
            try {
                configuration = new Configuration().configure();
                sessionFactory = configuration.buildSessionFactory();
            } catch (Throwable ex) {
                throw new ExceptionInInitializerError(ex);
            }
        }
        public static Session currentSession() {
            //sessionTL的get()方法根据当前线程返回其对应的线程内部变量,
            //也就是我们需要的Session,多线程情况下共享数据库连接是不安全的。
            //ThreadLocal保证了每个线程都有自己的Session。
            Session session = (Session) sessionTL.get();
            // 如果session为null,则打开一个新的session
            if (session == null) {
                //创建一个数据库连接对象session。
                session = sessionFactory.openSession();
                // 保存该数据库连接session到ThreadLocal中。
                sessionTL.set(session);
            }
            //如果当前线程已经访问过数据库了,
            //则从sessionTL中get()就可以获取该线程上次获取过的数据库连接对象。
            return session;
        }

        /**
         * 关闭Session
         */
        public static void closeSession(){
            Session session = (Session) sessionTL.get();
            sessionTL.set(null);
            session.close();
        }
}

①初始化一个ThreadLocal对象,该对象有get()、set()方法

②sessionTL的get()方法根据当前线程返回其对应的线程内部变量  也就是我们需要的Session,多线程情况下共享数据库连接是不安全的。 ThreadLocal保证了每个线程都有自己的Session。

③ 如果该线程是初次访问,session是NULL,则创建一个Session对象

④创建一个Session对象,保存该对象到ThreadLocal中

⑤ 如果当前线程已经访问过数据库,则从SessionTL中get()就可以获取该线程上次获取过得Session对象

⑥关闭Session,通过ThreadLocal类,既实现了多线程并发,同时,也实现了Singleton单例模式



ThreadLocal解析

时间: 2024-10-20 06:48:21

ThreadLocal解析的相关文章

java线程内存模型,线程、工作内存、主内存

转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程有自己的工作内存 refreshing local memory to/from main memory must  comply to JMM rules 产生线程安全的原因 线程的working memory是cpu的寄存器和高速缓存的抽象描述:现在的计算机,cpu在计算的时候,并不总是从内存读

ThreadLocal源码解析

ThreadLocal经常被使用到,但是一直没有研究过它的实现原理. 在看源码之前,我猜测它是这样设计的:ThreadLocal中包含一个Map<Thread,Map<ThreadLocal, V>>属性,在使用时,通过Thread.currentThread()获取到当前线程,从而根据Key,找到Map<ThreadLocal, V>,后来发现是错的.所以本文通过阅读JDK1.7源码,来解析ThreadLocal的设计思想和原理. ThreadLocal只包含一个属性

Java 8 ThreadLocal 源码解析

Java 中的 ThreadLocal是线程内的局部变量, 它为每个线程保存变量的一个副本.ThreadLocal 对象可以在多个线程中共享, 但每个线程只能读写其中自己的副本. 目录: 代码示例 源码解析 InheritableThreadLocal ThreadLocalMap Get 流程 Set 流程 Remove 代码示例 我们编写一个简单的示例: import java.util.Random; import java.util.concurrent.ExecutorService;

ThreadLocal类的用法与源码解析

首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各个线程中访问的是不同的对象. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本.通过ThreadLocal.set()将这个新创建

解析ThreadLocal

如果定义了一个单实例的java bean,它有若干属性,但是有一个属性不是线程安全的,比如说HashMap.并且碰巧你并不需要在不同的线程中共享这个属性,也就是说这个属性不存在跨线程的意义.那么不推荐使用sychronize,可使用ThreadLocal 关键代码如下: package cn.happy.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg

ThreadLocal 类的源码解析

1.原理图说明 首先看这一张图,我们可以看出,每一个Thread类中都存在一个属性 ThreadLocalMap 成员,该成员是一个map数据结构,map中是一个Entry的数组,存在entry实体,该实体包含了 key value hash (注意 此map结构不包含next引用 所以不是使用的链地址方法). 可以是用来存放 ThreadLocal对象以及对应的变量副本: 根据这个原理.我们可以知道在一个线程中可以存储多个 ThreadLocal 对象以及对应的value副本: 所以Threa

ThreadLocal 类 的源码解析以及使用原理

1.原理图说明 首先看这一张图,我们可以看出,每一个Thread类中都存在一个属性 ThreadLocalMap 成员,该成员是一个map数据结构,map中是一个Entry的数组,存在entry实体,该实体包含了 key value hash (注意 此map结构不包含next引用 所以不是使用的链地址方法). 可以是用来存放 ThreadLocal对象以及对应的变量副本: 根据这个原理.我们可以知道在一个线程中可以存储多个 ThreadLocal 对象以及对应的value副本: 所以Threa

【Java源码解析】ThreadLocal

简介 线程本地变量,用于同一线程之间的传递.每一个线程对象都保存在两个ThreadLocalMap,threadLocals和inheritableThreadLocals,后者会继承父线程的本地变量,以ThreadLocal对象为key,取得map里的值. 源码 属性和构造方法 1 // 哈希值 2 private final int threadLocalHashCode = nextHashCode(); 3 4 private static AtomicInteger nextHashC

Java并发编程:ThreadLocal的使用以及实现原理解析

前言 前面的文章里,我们学习了有关锁的使用,锁的机制是保证同一时刻只能有一个线程访问临界区的资源,也就是通过控制资源的手段来保证线程安全,这固然是一种有效的手段,但程序的运行效率也因此大大降低.那么,有没有更好的方式呢?答案是有的,既然锁是严格控制资源的方式来保证线程安全,那我们可以反其道而行之,增加更多资源,保证每个线程都能得到所需对象,各自为营,互不影响,从而达到线程安全的目的,而ThreadLocal便是采用这样的思路. ThreadLocal实例 ThreadLocal翻译成中文的话大概