自己实现ThreadLocal源码!

模拟ThreadLocal 代码

package com.bestksl.example.threadlocal;

import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;

public class MyThreadLocal<T> {
    static HashMap<Thread, HashMap<Integer, Object>> threadLocalMap = new HashMap<>();  // 利用哈希值作为key 防止Thread对象作为key影响垃圾回收(一直持有引用)
    AtomicInteger atomic = new AtomicInteger();
    Integer threadLocalHash = atomic.addAndGet(0x61c88674);


    protected T initialValue() {  // 初始化赋值
        return null;
    }

    protected static synchronized HashMap<Integer, Object> getMap() {
        Thread thread = Thread.currentThread();           // 解耦 + 保证同步线程安全
        if (!threadLocalMap.containsKey(thread)) {
            threadLocalMap.put(thread, new HashMap<Integer, Object>());
        }
        return threadLocalMap.get(thread);
    }

    protected T get() {          
        HashMap<Integer, Object> map = getMap();
        if (!map.containsKey(threadLocalHash)) {   // 不存在就初始化
            map.put(threadLocalHash, initialValue());
        }

        return (T) map.get(threadLocalHash);
    }

    protected void set(T t) {
        HashMap<Integer, Object> map = getMap();
        map.put(threadLocalHash, t);
    }

    protected void remove() {
        HashMap<Integer, Object> map = getMap();
        map.remove(threadLocalHash);  // 清空key
    }
}

测试代码

package com.bestksl.example.threadlocal;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Test {
    static MyThreadLocal<Long> longMyThreadLocal = new MyThreadLocal<Long>() {
        @Override
        protected Long initialValue() {
            return Thread.currentThread().getId();
        }
    };


    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(() -> log.info("value is {}", longMyThreadLocal.get())).start();
        }
    }


}

输出结果

04:24:19.545 [Thread-14] INFO com.bestksl.example.threadlocal.Test - value is 25
04:24:19.552 [Thread-44] INFO com.bestksl.example.threadlocal.Test - value is 55
04:24:19.552 [Thread-45] INFO com.bestksl.example.threadlocal.Test - value is 56
04:24:19.551 [Thread-41] INFO com.bestksl.example.threadlocal.Test - value is 52
04:24:19.553 [Thread-47] INFO com.bestksl.example.threadlocal.Test - value is 58
04:24:19.552 [Thread-46] INFO com.bestksl.example.threadlocal.Test - value is 57
04:24:19.551 [Thread-42] INFO com.bestksl.example.threadlocal.Test - value is 53
04:24:19.548 [Thread-38] INFO com.bestksl.example.threadlocal.Test - value is 49
04:24:19.548 [Thread-36] INFO com.bestksl.example.threadlocal.Test - value is 47
04:24:19.548 [Thread-39] INFO com.bestksl.example.threadlocal.Test - value is 50
04:24:19.548 [Thread-37] INFO com.bestksl.example.threadlocal.Test - value is 48
04:24:19.553 [Thread-48] INFO com.bestksl.example.threadlocal.Test - value is 59
04:24:19.548 [Thread-40] INFO com.bestksl.example.threadlocal.Test - value is 51
04:24:19.553 [Thread-49] INFO com.bestksl.example.threadlocal.Test - value is 60
04:24:19.553 [Thread-50] INFO com.bestksl.example.threadlocal.Test - value is 61
04:24:19.553 [Thread-43] INFO com.bestksl.example.threadlocal.Test - value is 54
04:24:19.553 [Thread-51] INFO com.bestksl.example.threadlocal.Test - value is 62
04:24:19.548 [Thread-35] INFO com.bestksl.example.threadlocal.Test - value is 46
04:24:19.548 [Thread-34] INFO com.bestksl.example.threadlocal.Test - value is 45
04:24:19.553 [Thread-52] INFO com.bestksl.example.threadlocal.Test - value is 63
04:24:19.548 [Thread-33] INFO com.bestksl.example.threadlocal.Test - value is 44
04:24:19.548 [Thread-32] INFO com.bestksl.example.threadlocal.Test - value is 43
04:24:19.548 [Thread-31] INFO com.bestksl.example.threadlocal.Test - value is 42
04:24:19.548 [Thread-30] INFO com.bestksl.example.threadlocal.Test - value is 41
04:24:19.548 [Thread-29] INFO com.bestksl.example.threadlocal.Test - value is 40
04:24:19.554 [Thread-54] INFO com.bestksl.example.threadlocal.Test - value is 65
04:24:19.548 [Thread-28] INFO com.bestksl.example.threadlocal.Test - value is 39
04:24:19.546 [Thread-9] INFO com.bestksl.example.threadlocal.Test - value is 20
04:24:19.547 [Thread-22] INFO com.bestksl.example.threadlocal.Test - value is 33
04:24:19.554 [Thread-55] INFO com.bestksl.example.threadlocal.Test - value is 66
04:24:19.547 [Thread-27] INFO com.bestksl.example.threadlocal.Test - value is 38
04:24:19.545 [Thread-12] INFO com.bestksl.example.threadlocal.Test - value is 23
04:24:19.545 [Thread-1] INFO com.bestksl.example.threadlocal.Test - value is 12
04:24:19.554 [Thread-56] INFO com.bestksl.example.threadlocal.Test - value is 67
04:24:19.545 [Thread-15] INFO com.bestksl.example.threadlocal.Test - value is 26
04:24:19.545 [Thread-4] INFO com.bestksl.example.threadlocal.Test - value is 15
04:24:19.555 [Thread-57] INFO com.bestksl.example.threadlocal.Test - value is 68
04:24:19.547 [Thread-26] INFO com.bestksl.example.threadlocal.Test - value is 37
04:24:19.546 [Thread-19] INFO com.bestksl.example.threadlocal.Test - value is 30
04:24:19.545 [Thread-0] INFO com.bestksl.example.threadlocal.Test - value is 11
04:24:19.547 [Thread-24] INFO com.bestksl.example.threadlocal.Test - value is 35
04:24:19.546 [Thread-2] INFO com.bestksl.example.threadlocal.Test - value is 13
04:24:19.555 [Thread-59] INFO com.bestksl.example.threadlocal.Test - value is 70
04:24:19.545 [Thread-8] INFO com.bestksl.example.threadlocal.Test - value is 19
04:24:19.545 [Thread-11] INFO com.bestksl.example.threadlocal.Test - value is 22
04:24:19.546 [Thread-5] INFO com.bestksl.example.threadlocal.Test - value is 16
04:24:19.555 [Thread-60] INFO com.bestksl.example.threadlocal.Test - value is 71
04:24:19.555 [Thread-58] INFO com.bestksl.example.threadlocal.Test - value is 69
04:24:19.545 [Thread-7] INFO com.bestksl.example.threadlocal.Test - value is 18
04:24:19.546 [Thread-18] INFO com.bestksl.example.threadlocal.Test - value is 29
04:24:19.555 [Thread-61] INFO com.bestksl.example.threadlocal.Test - value is 72
04:24:19.545 [Thread-13] INFO com.bestksl.example.threadlocal.Test - value is 24
04:24:19.545 [Thread-10] INFO com.bestksl.example.threadlocal.Test - value is 21
04:24:19.545 [Thread-6] INFO com.bestksl.example.threadlocal.Test - value is 17
04:24:19.547 [Thread-25] INFO com.bestksl.example.threadlocal.Test - value is 36
04:24:19.556 [Thread-62] INFO com.bestksl.example.threadlocal.Test - value is 73
04:24:19.545 [Thread-3] INFO com.bestksl.example.threadlocal.Test - value is 14
04:24:19.556 [Thread-63] INFO com.bestksl.example.threadlocal.Test - value is 74
04:24:19.547 [Thread-20] INFO com.bestksl.example.threadlocal.Test - value is 31
04:24:19.546 [Thread-17] INFO com.bestksl.example.threadlocal.Test - value is 28
04:24:19.547 [Thread-21] INFO com.bestksl.example.threadlocal.Test - value is 32
04:24:19.556 [Thread-64] INFO com.bestksl.example.threadlocal.Test - value is 75
04:24:19.556 [Thread-65] INFO com.bestksl.example.threadlocal.Test - value is 76
04:24:19.556 [Thread-66] INFO com.bestksl.example.threadlocal.Test - value is 77
04:24:19.556 [Thread-67] INFO com.bestksl.example.threadlocal.Test - value is 78
04:24:19.556 [Thread-68] INFO com.bestksl.example.threadlocal.Test - value is 79
04:24:19.556 [Thread-69] INFO com.bestksl.example.threadlocal.Test - value is 80
04:24:19.557 [Thread-70] INFO com.bestksl.example.threadlocal.Test - value is 81
04:24:19.557 [Thread-71] INFO com.bestksl.example.threadlocal.Test - value is 82
04:24:19.557 [Thread-72] INFO com.bestksl.example.threadlocal.Test - value is 83
04:24:19.557 [Thread-73] INFO com.bestksl.example.threadlocal.Test - value is 84
04:24:19.557 [Thread-74] INFO com.bestksl.example.threadlocal.Test - value is 85
04:24:19.557 [Thread-75] INFO com.bestksl.example.threadlocal.Test - value is 86
04:24:19.557 [Thread-76] INFO com.bestksl.example.threadlocal.Test - value is 87
04:24:19.557 [Thread-77] INFO com.bestksl.example.threadlocal.Test - value is 88
04:24:19.557 [Thread-78] INFO com.bestksl.example.threadlocal.Test - value is 89
04:24:19.557 [Thread-79] INFO com.bestksl.example.threadlocal.Test - value is 90
04:24:19.557 [Thread-80] INFO com.bestksl.example.threadlocal.Test - value is 91
04:24:19.558 [Thread-81] INFO com.bestksl.example.threadlocal.Test - value is 92
04:24:19.558 [Thread-83] INFO com.bestksl.example.threadlocal.Test - value is 94
04:24:19.558 [Thread-84] INFO com.bestksl.example.threadlocal.Test - value is 95
04:24:19.558 [Thread-85] INFO com.bestksl.example.threadlocal.Test - value is 96
04:24:19.558 [Thread-86] INFO com.bestksl.example.threadlocal.Test - value is 97
04:24:19.558 [Thread-87] INFO com.bestksl.example.threadlocal.Test - value is 98
04:24:19.558 [Thread-88] INFO com.bestksl.example.threadlocal.Test - value is 99
04:24:19.558 [Thread-89] INFO com.bestksl.example.threadlocal.Test - value is 100
04:24:19.558 [Thread-90] INFO com.bestksl.example.threadlocal.Test - value is 101
04:24:19.558 [Thread-91] INFO com.bestksl.example.threadlocal.Test - value is 102
04:24:19.558 [Thread-92] INFO com.bestksl.example.threadlocal.Test - value is 103
04:24:19.559 [Thread-93] INFO com.bestksl.example.threadlocal.Test - value is 104
04:24:19.559 [Thread-94] INFO com.bestksl.example.threadlocal.Test - value is 105
04:24:19.559 [Thread-95] INFO com.bestksl.example.threadlocal.Test - value is 106
04:24:19.559 [Thread-96] INFO com.bestksl.example.threadlocal.Test - value is 107
04:24:19.559 [Thread-97] INFO com.bestksl.example.threadlocal.Test - value is 108
04:24:19.559 [Thread-98] INFO com.bestksl.example.threadlocal.Test - value is 109
04:24:19.559 [Thread-99] INFO com.bestksl.example.threadlocal.Test - value is 110
04:24:19.554 [Thread-53] INFO com.bestksl.example.threadlocal.Test - value is 64
04:24:19.547 [Thread-23] INFO com.bestksl.example.threadlocal.Test - value is 34
04:24:19.545 [Thread-16] INFO com.bestksl.example.threadlocal.Test - value is 27
04:24:19.558 [Thread-82] INFO com.bestksl.example.threadlocal.Test - value is 93
发布了242 篇原创文章 · 获赞 407 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_33709508/article/details/105390821