线程局部变量(ThreadLocal)

通常状况下,咱们将一个线程中的局部变量保存在线程之中。本文以装Connection为例子。作法以下:web

第一步:ide

private static ThreadLocal<Connection> tl;this

第二步:spa

public static Connection getConnection() {
      Connection con = tl.get();
     if (con == null) {
     try {
         con = ds.getConnection();.net

         tl.set(con);线程

         } catch (Exception e) {
           throw new RuntimeException(e);
          }
  }orm

    return con;对象

 }事务

这样咱们在处理事务时就会有使用同一对象,或者变量。ci

那咱们来看下源码是这些方法是怎么实现的呢?

一、首先咱们先看下源码:

 /**
     * Sets the current thread's copy of this thread-local variable
     * to the specified value.  Most subclasses will have no need to
     * override this method, relying solely on the {@link #initialValue}
     * method to set the values of thread-locals.
     *
     * @param value the value to be stored in the current thread's copy of
     *        this thread-local.
     */
    public void set(T value) {
        Thread t = Thread.currentThread();//这里是拿到当前的线程
        ThreadLocalMap map = getMap(t);// 在这个进一步查看源码时,会看到其实就是MAP对象。以当前的t为key
        if (map != null)    
            map.set(this, value);
        else
            createMap(t, value);
    }

   也就是说上面的代码,是将数据装在MAP里面、

那么咱们在来看下get()方法是怎么实现的呢?

二、get()

    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

相信你们看到了这里应该就明白了吧,数据就是这么放的,从此咱们在解决一些处理事务的时候,能够拥这个来解决、

每一个thread中都存在一个map,map的类型是ThreadLocal,ThreadLocalMap,Map中的key为一个threadlocal实例。这个map的也使用了弱引用。不过弱引用是针对key,每一个key都弱引用指向threadlocal,当咱们指向的为空,就会被gc回收。

相关文章
相关标签/搜索