Android踩过的坑

ThreadLocal 源码在Android sdk 和JDK中

2018-02-21  本文已影响0人  loongstone

最近看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的代码并不是很直观)

上一篇下一篇

猜你喜欢

热点阅读