自己实现一个ThreadLocal

public class ThreadLocalMy<T> {

    private Map<Thread, Map<ThreadLocalMy, T>> map = new ConcurrentHashMap<>();

    public T get() {
        Map<ThreadLocalMy, T> t = map.get(Thread.currentThread());
        if (t == null) {
            return null;
        }
        return t.get(this);
    }

    public void set(T value) {
        Map<ThreadLocalMy, T> t = map.get(Thread.currentThread());
        if (t == null) {
            t = new HashMap<>();
            t.put(this, value);
            map.put(Thread.currentThread(), t);
        }
        t.put(this, value);
    }

    public void remove() {
        map.remove(Thread.currentThread());
    }
}
public class ThreadTest implements Runnable {

    public static final ThreadLocalMy<Integer> tt = new ThreadLocalMy<>();
    public static AtomicInteger t2 = new AtomicInteger(0);
    public static int t3;
    public static final ThreadLocalMy<Integer> t4 = new ThreadLocalMy<>();
    @Override
    public void run() {
        for (int i=0;i<1000000; i++) {
            if (tt.get() == null) {
                tt.set(0);
            }
            tt.set(tt.get() + 1);
            t2.incrementAndGet();
            t3 = t3 + 1;
            if (t4.get() == null) {
                t4.set(0);
            }
            t4.set(t4.get() + 3);
        }
        System.out.println("threadlocaltt" + tt.get());
        System.out.println("atomic" + t2);
        System.out.println(t3);
        System.out.println("threadlocalt4" + t4.get());
    }

}

测试代码

public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new ThreadTest());

        Thread t2 = new Thread(new ThreadTest());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容