最近看ThreadLocal源码时候,发现书上的 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想看看具体代码,发现代码有些差异
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
同时差异也不止此处,感觉应该是版本的问题,于是手动查看sdk代码,发现 sdk 23 是第一种代码,sdk24及之后版本是第二种代码 。
代码目录: android-sdk根目录\sources\android-version\java\lang\ThreadLocal.java
再查看 JDK8的源码,发现和 第二种基本一致。
其实在不同版本的源码注释中的版权部分也可以看出端倪。
SDK 23版权注释
/*
* 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 版权注释(与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.
经了解现在Android使用的是Open JDK,源码和Oracle JDK基本相同。
参考知乎这篇回答:https://www.zhihu.com/question/40103672
现在看ThreadLocal源码时候可以以新版理解,主要思想都是一致的,除非对此处使用要求极高,否则不必纠结与代码细节,应以理解思想为主。(个人认为 sdk 23的代码并不是很直观)