5、其他
5.1、ThreadLocal
一种解决多线程环境下成员变量的问题的方案,但是与线程同步无关。其思路是为每个线程创建一个单独的变量副本,从而每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程对应的副本。
ThreadLocal不是用于解决共享变量的问题的,也不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一种机制。
ThreadLocal的四个方法:
get():返回此线程局部变量的当前线程副本中的值。
initialValue():返回此线程局部变量的当前线程的“初始值”。
remove():移除此线程局部变量当前线程的值。
set(T value):将此线程局部变量的当前线程副本中的值设置为指定值。
Get方法:
public T get() {
Thread t = Thread.currentThread();//获取当前线程
ThreadLocalMap map = getMap(t); //返回t.threadLocals,当前线程中局部变量ThreadLocalMap
if (map != null) {
//当前线程中有ThreadLocalMap
ThreadLocalMap.Entry e = map.getEntry(this);//根据当前线程获取Map中的Entry,Key是ThreadLocal,value是值
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
//初始化ThreadLocalMap 和 Entry
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;
}
initialValue方法:
protected T initialValue() { //new ThreadLocal的时候初始化
return null;
}
remove方法:
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if