ThreadLocal的使用- -

原创 2007年10月08日 11:13:00

以前一直以为ThreadLocal很复杂, 只知道它的功能大概是将一个对象邦定到一个线程当中或者多个线程当中, 使得每个线程都使用同样一个对象。
举例说明:
public class HibernateSessionFactory {

private static final ThreadLocal threadLocal = new ThreadLocal();

public static Session currentSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

        if (session == null) {
            if (sessionFactory == null) {
                try {
                    cfg.configure(CONFIG_FILE_LOCATION);
                    sessionFactory = cfg.buildSessionFactory();
                }
                catch (Exception e) {
                    System.err.println("%%%% Error Creating SessionFactory %%%%");
                    e.printStackTrace();
                }
            }
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }

        return session;
    }
...
}

可以看到currentSession()方法每次返回的对象都是线程唯一。

其实ThreadLocal的实现不难,在看它的源代码之前,我想到的实现方案大概是,通过Thread.currentThread()获得当前线程,然后通过封装将待绑定的对象绑定到currentThread()上。

事实上,sun的实现方案也是大概如此。
可以看看ThreadLocal的get()方法的代码:
    public Object get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            return map.get(this);

        // Maps are constructed lazily.  if the map for this thread
        // doesn't exist, create it, with this ThreadLocal and its
        // initial value as its only entry.
        Object value = initialValue();
        createMap(t, value);
        return value;
    }
ThreadLocalMap就是上面提到的那个封装Thread的对象。
值得注意的是:  return map.getI(this);
可见ThreadLocal在set()和get()的时候需要保持为同一份对象的引用,才能保证能够正确地取出绑定的对象。
通过在自己的class当中将ThreadLocal设置为static的形式即可。

 

在web项目中使用 ThreadLocal 要谨慎,使用不当容易造成内存溢出

这里使用的servlet容器是 tomcat如果在web项目中,使用 ThreadLocal 不当,会造成 OutOfMemoryError。说明原因前 1:先讲一下 ThreadLocal,The...
  • liang_love_java
  • liang_love_java
  • 2016年09月29日 13:56
  • 2123

ThreadLocal 内部实现和应用场景

很多人都知道java中有ThreadLocal这个类,但是知道ThreadLocal这个类具体有什么作用,然后适用什么样的业务场景还是很少的。今天我就尝试以自己的理解,来讲解下ThreadLocal类...
  • z69183787
  • z69183787
  • 2016年05月24日 14:41
  • 6859

threadlocal原理及常用应用场景

想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码...
  • sonny543
  • sonny543
  • 2016年05月07日 10:09
  • 12740

使用ThreadLocal解决代码分层问题

  • 2016年10月22日 08:58
  • 1.09MB
  • 下载

【菜鸟学Java】14:使用ThreadLocal对Connection进行封装

问题背景:         使用JDBC进行开发的时候,每一次的增删改查都必须和数据库建立连接,才可以对数据项进行相应的操作。当我们的业务比较复杂的情况下,可能会出现在一个方法中多次的执行增删改查,...
  • u010929604
  • u010929604
  • 2016年02月24日 11:53
  • 1159

ThreadLocal使用,Thread的start和run的区别,等一些琐碎的东西

首先什么是ThreadLocal,threadlocal是一种解决多线程并发的方案。它的主体是Java类ThreadLocal。 多线程在处理数据时,常因为某个数据已经被其他线程改动,导致并发问题...
  • u012723715
  • u012723715
  • 2017年06月08日 10:40
  • 124

java线程中ThreadLocal类的使用及介绍

ThreadLocal总结 1、ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务...
  • chenleixing
  • chenleixing
  • 2015年01月03日 22:46
  • 928

ThreadLocal使用初探

[消息]   好文推荐到我的圈子 分类:Java核心技术 标签: (可以给文章补个标签哟,最多可添加3个标签) 未引用的圈子: 确 定 取 消...
  • ChiChengIT
  • ChiChengIT
  • 2012年09月19日 10:00
  • 1121

为避免多线程Connection混乱使用ThreadLocal来封装事务

上一篇博客总结了动态代理的使用及代码的含义。接下来,继续探究动态代理的实地应用——利用动态代理来封装事务。 首先,要先来回忆一下最原始的封装好的事务的代码,这里在连接数据库时用到了TheadL...
  • wangyy130
  • wangyy130
  • 2015年10月07日 20:43
  • 872

Java之ThreadLocal的理解和使用

ThreadLocal类 官方解释: This class provides thread-local variables. These variables differ from their no...
  • qq_35439782
  • qq_35439782
  • 2017年12月28日 13:45
  • 29
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ThreadLocal的使用- -
举报原因:
原因补充:

(最多只允许输入30个字)