最近看ThreadLocal源碼時候践惑,發(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方法有點疑惑,于是打開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);
}
同時差異也不止此處秒裕,感覺應(yīng)該是版本的問題,于是手動查看sdk代碼枚碗,發(fā)現(xiàn) sdk 23 是第一種代碼逾一,sdk24及之后版本是第二種代碼 。
代碼目錄: android-sdk根目錄\sources\android-version\java\lang\ThreadLocal.java
再查看 JDK8的源碼肮雨,發(fā)現(xiàn)和 第二種基本一致遵堵。
其實在不同版本的源碼注釋中的版權(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源碼時候可以以新版理解,主要思想都是一致的波丰,除非對此處使用要求極高限番,否則不必糾結(jié)與代碼細(xì)節(jié),應(yīng)以理解思想為主呀舔。(個人認(rèn)為 sdk 23的代碼并不是很直觀)