ThreadLocal
仿ThreadLocal源码理解其原理;
1.定义自己的ThreadLocal实现
import java.util.HashMap; public class MyThreadLocal<T> { public class MyThreadLocalMap { private HashMap<String, T> map; private MyThreadLocalMap() { map = new HashMap<String, T>(); } } public T initValue() { return null; } public void createMap(MyThread t) { t.setLocalMap(new MyThreadLocalMap()); } public T setInitValue(MyThread t) { T value = initValue(); MyThreadLocalMap map = t.getLocalMap(); if (null == map) { createMap(t); } t.getLocalMap().map.put(String.valueOf(this.hashCode()), value); return value; } public void set(T value) { MyThread thread = (MyThread)Thread.currentThread(); MyThreadLocalMap localMap = thread.getLocalMap(); if (null == localMap) { createMap(thread); } thread.getLocalMap().map.put(String.valueOf(this.hashCode()), value); } public T get() { MyThread thread = (MyThread)Thread.currentThread(); MyThreadLocalMap localMap = thread.getLocalMap(); if (null != localMap) { return localMap.map.get(String.valueOf(this.hashCode())); } return setInitValue(thread); } public void remove() { MyThread thread = (MyThread)Thread.currentThread(); MyThreadLocalMap localMap = thread.getLocalMap(); if (null != localMap) { localMap.map.remove(String.valueOf(this.hashCode())); } } }
2.继承Thread实现自己的Thread
public class MyThread extends Thread { private MyThreadLocal.MyThreadLocalMap localMap; public MyThread(Runnable runnable) { super(runnable); } public void setLocalMap(MyThreadLocal.MyThreadLocalMap map) { localMap = map; } public MyThreadLocal.MyThreadLocalMap getLocalMap() { return localMap; } }
测试代码:
public class Main { public static void main(String[] args) { Runnable runnable = new Runnable() { public void run() { MyThreadLocal local = new MyThreadLocal() { @Override public Object initValue() { return Thread.currentThread().getName(); } }; System.out.println(local.get()); } }; MyThread thread1 = new MyThread(runnable); MyThread thread2 = new MyThread(runnable); thread1.setName("thread1"); thread2.setName("thread2"); thread2.start(); thread1.start(); } }
概述
ThreadLocal即线程变量(自己这么叫的不是很准确),极大的方便线程独享资源的管理,不需要再对资源进行管理避免了因多线程造成的问题;ThreadLocal将线程自己的数据封装到内部,用ThreadLocal计算出hashcode为键值(本文用的HashMap存储,讲明原理),通过内部类Entity实现存储(哈希数组初始值16);