ThreadLocal 原理

每个 Thread 都有一个 ThreadLocalMap 成员变量.
为什么不是一个 ThreadLocal 维护一个 ThreadMap 呢?
想法:
如果 ThreadLocal 维护 ThreadMap, 那么这个 ThreadMap 需要是线程安全的, 要处理并发问题.
而 Thread 的 ThreadLocalMap 因为所有操作都在当前线程, 巧妙的避开了并发问题, 所以没有线程安全问题!
所以 Thread 维护 ThreadLocalMap 不用考虑并发.

如果自己实现一个 ThreadLocal
public class MyThreadLocal {private static Map<Thread, String> threadMap = new HashMap<>(); // 这个是有线程安全问题的!private static Map<Thread, String> threadMap = new ConcurrentHashMap<>(); // 这个是线程安全的, 但是效率低public void set(String value) {threadMap.put(Thread.currentThread(), value);}public String get() {return threadMap.get(Thread.currentThread());}private static MyThreadLocal threadLocal = new MyThreadLocal();public static void main(String[] args) {while (true) {new Thread(() -> {String uuid = UUID.randomUUID().toString();threadLocal.set(uuid); // settry {Thread.sleep(1);} catch (Exception e) {System.out.println(e.getMessage());}String uuid2 = threadLocal.get(); // getif (!uuid.equals(uuid2)) { // 比较System.out.println("Not Equal! 1: " + uuid + " 2: " + uuid2);}}).start();}}}
创建有初始值的 ThreadLocal
ThreadLocal<Object> threadLocal = new ThreadLocal<Object>(){
@Override
protected Object initialValue() {
return new Object();
}
};
ThreadLocal<Object> threadLocal = ThreadLocal.withInitial(Object::new);
