如果认为自己掌握了ThreadLocal,就自己实现一个ThreadLocal验证一下吧。
import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * Thread Local 顾名思义,线程局部的,也就是说属于线程自己的。 * 通过山寨一个Thread Local来检验自己是不是真的理解了Thread Local. * * 每一个线程都有自己的存储空间,那么需要的就是一个map, * 以当前线程为key,以要存储的值为value. * * */ public class MyThreadLocal<T> { private Map<Thread, T> holder = Collections.synchronizedMap(new HashMap<>()); public void set(T value) { holder.put(Thread.currentThread(), value); } public T get() { // do not return directly,the value may be null Thread key = Thread.currentThread(); T value = holder.get(key); if (value == null && !holder.containsKey(key)) { holder.put(key, initialValue()); } return holder.get(key); } /** * It‘s good for GC */ public void remove() { holder.remove(Thread.currentThread()); } /** * protected imply method should be override * * @return */ protected T initialValue() { return null; } }
原文:https://www.cnblogs.com/luohaonan/p/12536555.html