ThreadLocal 源碼在Android sdk 和JDK中的差異

最近看ThreadLocal源碼時(shí)候,發(fā)現(xiàn)書上的 ThreadLocal.set() 方法的源碼如下

    public void set(T value) {
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread);
        if (values == null) {
            values = initializeValues(currentThread);
        }
        values.put(this, value);
    }

對如values方法有點(diǎn)疑惑,于是打開AS想看看具體代碼,發(fā)現(xiàn)代碼有些差異

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

同時(shí)差異也不止此處,感覺應(yīng)該是版本的問題,于是手動(dòng)查看sdk代碼,發(fā)現(xiàn) sdk 23 是第一種代碼,sdk24及之后版本是第二種代碼 。

代碼目錄: android-sdk根目錄\sources\android-version\java\lang\ThreadLocal.java

再查看 JDK8的源碼,發(fā)現(xiàn)和 第二種基本一致。
其實(shí)在不同版本的源碼注釋中的版權(quán)部分也可以看出端倪。

SDK 23版權(quán)注釋

/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at 
...

SDK 26 版權(quán)注釋(與SDK 24 等的年份差異請忽略)

/*
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

經(jīng)了解現(xiàn)在Android使用的是Open JDK,源碼和Oracle JDK基本相同。
參考知乎這篇回答:https://www.zhihu.com/question/40103672

現(xiàn)在看ThreadLocal源碼時(shí)候可以以新版理解,主要思想都是一致的,除非對此處使用要求極高,否則不必糾結(jié)與代碼細(xì)節(jié),應(yīng)以理解思想為主。(個(gè)人認(rèn)為 sdk 23的代碼并不是很直觀)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容