ThreadLoacl对象的使用原理和使用场景

ThreadLoacl对象的使用原理和使用场景

      • 使用原理
      • 使用场景

使用原理

  1. 线程本地类对每个对象在每个线程进行副本保存,即每个线程取的对象都是不同的对象,该对象只在对象的线程使用,所以是线程安全的
  2. 源码查看:取值代码 get()方法
   public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

getMap()方法

 ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

setInitialValue() 方法

 private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

createMap(t, value); 方法

void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

threadLocals 该变量是Thread的一个成员变量,ThreadLocalMap的结构是一个弱引用变量 保证了当内存不足会自动回收该部分内存。关键的是threadlocals是当前线程的成员变量,即每个Map里面就保存了一个值

使用场景

  1. 用来保存数据库的链接,可能使用数据库连接池会好点,
  2. 用来保存数据库连接session,即保证了每个线程都会使用对应的连接,保证了线程安全

你可能感兴趣的:(java多线程,ThreadLoacl)