@chenxuxiong
2016-05-23T02:50:43.000000Z
字数 839
阅读 478
JAVA基础
线程
作用:在多线程环境下,为每个线程维护自己专用的对象
如:我们可以维护一个HttpServletRequest,HttpServletResponse为它每次请求都创建一个副本,达到线程隔离的目的。
实现原理
ThreadLocal有一个静态内部类ThreadLocalMap,它实现了键值对的设置和获取(对比Map对象来理解),每个线程中都有一个独立的ThreadLocalMap副本,它所存储的值,只能被当前线程读取和修改。
ThreadLocalMap的Entry继承了WeakReference,并且使用ThreadLocal作为键值。采用的是开地址法存储。
ThreadLocal类通过操作每一个线程特有的ThreadLocalMap副本,从而实现了变量访问在不同线程中的隔离。因为每个线程的变量都是自己特有的,完全不会有并发错误。
set方法
public void set(T value) {
Thread t = Thread.currentThread(); //先获取当前线程
ThreadLocalMap map = getMap(t); //根据当前线程查找到对应的Map
if (map != null)
map.set(this, value); //map不为空则以this为键存放对象
else
createMap(t, value);//map为空则创建map并存储
}
get方法:每次获取对象的时候,调用get方法,先获取当前线程,然后根据当前线程获取到ThreadLocalMap,再找到对应的entry
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();
}