美文网首页Android踩过的坑
ThreadLocal 源码在Android sdk 和JDK中

ThreadLocal 源码在Android sdk 和JDK中

作者: loongstone | 来源:发表于2018-02-21 15:27 被阅读0次

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

    相关文章

      网友评论

        本文标题:ThreadLocal 源码在Android sdk 和JDK中

        本文链接:https://www.haomeiwen.com/subject/njontftx.html