Java基础-concurrent (4)

nextHashCode是ThreadLocal的静态变量,HASH_INCREMENT是静态常量,只有threadLocalHashCode是ThreadLocal实例的变量。
在创建ThreadLocal类实例的时候,将ThreadLocal类的下一个hashCode值即nextHashCode的值赋给实例的threadLocalHashCode,然后nextHashCode的值增加HASH_INCREMENT这个值。而实例变量threadLocalHashCode是final的,用来区分不同的ThreadLocal实例。
ThreadLocal实例stringLocal创建完成后,调用set()方法时,

public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }

先获取当前线程,即main线程,然后根据线程实例调用getMap()方法获取ThreadLocalMap,
其中getMap()方法如下:

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

getMap()方法直接返回线程的成员变量threadLocals,其中threadLocals变量是ThreadLocalMap类的实例,而ThreadLocalMap是ThreadLocal的内部类。
如果map(当前线程的成员变量threadLocals)存在,则将数据写入到ThreadLoclMap用于存储数据的Entry中。
ThreadLocalMap的set方法如下:

private void set(ThreadLocal<?> key, Object value) { Entry[] tab = table; int len = tab.length; int i = key.threadLocalHashCode & (len-1); for (Entry e = tab[i]; e != null; e = tab[i = nextIndex(i, len)]) { ThreadLocal<?> k = e.get(); if (k == key) { e.value = value; return; } if (k == null) { replaceStaleEntry(key, value, i); return; } } tab[i] = new Entry(key, value); int sz = ++size; if (!cleanSomeSlots(i, sz) && sz >= threshold) rehash(); }

其中Entry定义如下

static class Entry extends WeakReference<ThreadLocal<?>> { Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }

key为ThreadLocal实例,值是用户定义的具体对象值。

如果map(当前线程的成员变量threadLocals)不存在,则创建一个ThreadLocalMap实例,并和线程的成员变量threadLocals关联起来。其中ThreadLocalMap实例的key为this,即ThreadLocal实例stringLocal,值是用户定义的具体对象值。

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

总的来说,ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用。作用:提供一个线程内公共变量(比如本次请求的用户信息),减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度,或者为线程提供一个私有的变量副本,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

其他内容待续......

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppgsp.html