[关闭]
@chenxuxiong 2016-05-23T02:50:43.000000Z 字数 839 阅读 478

ThreadLocal

JAVA基础 线程


作用:在多线程环境下,为每个线程维护自己专用的对象

如:我们可以维护一个HttpServletRequest,HttpServletResponse为它每次请求都创建一个副本,达到线程隔离的目的。

实现原理

ThreadLocal有一个静态内部类ThreadLocalMap,它实现了键值对的设置和获取(对比Map对象来理解),每个线程中都有一个独立的ThreadLocalMap副本,它所存储的值,只能被当前线程读取和修改
ThreadLocalMap的Entry继承了WeakReference,并且使用ThreadLocal作为键值。采用的是开地址法存储。
ThreadLocal类通过操作每一个线程特有的ThreadLocalMap副本,从而实现了变量访问在不同线程中的隔离。因为每个线程的变量都是自己特有的,完全不会有并发错误。

set方法

  1. public void set(T value) {
  2. Thread t = Thread.currentThread(); //先获取当前线程
  3. ThreadLocalMap map = getMap(t); //根据当前线程查找到对应的Map
  4. if (map != null)
  5. map.set(this, value); //map不为空则以this为键存放对象
  6. else
  7. createMap(t, value);//map为空则创建map并存储
  8. }

get方法:每次获取对象的时候,调用get方法,先获取当前线程,然后根据当前线程获取到ThreadLocalMap,再找到对应的entry

  1. public T get() {
  2. Thread t = Thread.currentThread();
  3. ThreadLocalMap map = getMap(t);
  4. if (map != null) {
  5. ThreadLocalMap.Entry e = map.getEntry(this);
  6. if (e != null)
  7. return (T)e.value;
  8. }
  9. return setInitialValue();
  10. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注