Java线程池ThreadPool源码分析

private static final ThreadLocal<Object> threadlocal = new ThreadLocal<Object>() {
    @Override
    protected Object initialValue() {
        return new Object;
    }
};

value.set(**)

value.get()

源码分析

  1. 每个Thread里有一个包含一个 ThreadLocal.ThreadLocalMap threadLocals = null;
  2. 从维护一个Entry的数组,Entry是一个 WeakReference, 弱引用的是这个threadlocal,value 是 set的对象

所以其实就是从 当前Thread的一个map里找这个ThreadLocal为key的对象

ThreadLocal : 
public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

static class Entry extends WeakReference<ThreadLocal<?>> {
    /** The value associated with this ThreadLocal. */
    Object value;

    Entry(ThreadLocal<?> k, Object v) {
        super(k);
        value = v;
    }
}

Entry使用WeakReference的目的

一般定义ThreadLocal, 是使用的static的,也就是说一直会有一个强引用指向这个ThreadLocal
这个时候,Entry使用弱引用是没有效果的,因为不会被gc

场景是为了解决这种问题:
当一个线程的一个Threadlocal不再使用的时候,设为null(强引用释放)
但是该线程还持有这个ThreadLocalMap的时候,会导致该部分内存泄漏

比如说一个tomcat线程,每次操作都会 new一个ThreadLocal
然后起多个线程操作这个ThreadLocal
然后多个线程结束,这个ThreadLocal也不用了
如果不设置成虚引用的话,这个tomcat主线程里,就不会gc调这个threadlocal,因为当前线程的map里还有这个threadlocal的引用

更多推荐

更多
  • 九、Azure 发布管道——服务连接、模板、工件、阶段和环境 第 9.01 课:服务连接,第 9.02 课:使用模板,第 9.03 课:发布的工件,第 9.04 课:发布阶段,第 9.05 课:环境,摘要, 在前几章中,我们讨论了设置构建管道的特性和选项。构建管道允许您构建源代码并使用构建的二进制
    Apache CN

  • Azure ppl流水线-八、创建和使用 YAML 生成管道 第 8.01 课:YAML 管道入门,第 8.02 课:设置管道触发器和过滤器,第 8.03 课:在 YAML 中使用变量,第 8.04 课:管道中的作业和阶段,第 8.05 课:工作中的步骤和任务,第 8.06 课:使用模板,摘要,
    Apache CN

  • 十、Azure 发布管道——作业、部署组、变量和其他选项 第 10.01 课:代理作业,第 10.02 课:部署组作业,第 10.03 课:无代理作业,第 10.04 课:变量,第 10.05 课:其他有用的功能,摘要, 在前一章中,我们讨论了一些与发布管道相关的重要特性。描述了允许发布管理的
    Apache CN

  • Azure ppl流水线-十一、REST API、命令行和扩展开发 第 11.01 课:使用构建和发布 REST APIs,第 11.02 课:使用 Azure 管道 CLI,第 11.03 课:开发和分发扩展,摘要, 在前几章,我们讨论了 Azure DevOps 中的构建和发布管道。我们已经研究了经
    Apache CN

  • Azure ppl流水线-十二、将测试集成到管道中 第 12.01 课:使用管道运行单元测试,第 12.02 课:使用管道运行功能测试,摘要, 测试是软件交付过程中非常重要的一个方面。为了保证交付的软件项目或产品的质量,一些测试类型可以很容易地自动化,并与构建和发布管道相集成。在这一
    Apache CN

  • 五、创建构建管道——经典——变量、触发器、过滤器、选项和保留 第 5.01 课:使用变量,第 5.02 课:设置触发器和路径过滤器,第 5.03 课:格式化内部版本号,第 5.04 课:启用、禁用和暂停生成,第 5.05 课:生成和工作项,第 5.06 课:构建状态徽章,第 5.07 课:其他构建
    Apache CN

  • 六、创建构建管道——经典——排队、调试、任务组、工件和导入/导出选项 第 6.01 课:排队生成和启用调试模式以获取更多诊断信息,第 6.02 课:在 PowerShell 脚本中设置变量值,第 6.03 课:在 PowerShell 中访问秘密变量值,第 6.04 课:在构建中使用身份验证令牌,第 6.
    Apache CN

  • 四、创建构建管道——经典——源代码管理、模板、作业和任务 第 4.01 课:使用源代码管理提供程序,第 4.02 课:使用模板,第 4.03 课:使用多重职务,第 4.04 课:使用任务,摘要, 构建管道允许您编译源代码,运行单元测试,并将您的代码发布为可部署的工件。在经典的构建管道中,您可以
    Apache CN

  • Azure ppl流水线-七、使用工件 第 7.01 课:发布构建工件,第 7.02 课:将工件打包并发布为 NuGet,第 7.03 课:在构建中使用 NuGet 包,摘要, 构建的工件或输出包含二进制文件和将软件部署到目标环境所需的支持文件。根据正在构建的项目类型,以及部
    Apache CN

  • Azure ppl流水线-三、设置池、部署组和代理 第 3.01 课:设置池和权限,第 3.02 课:向池中添加代理,第 3.03 课:设置部署组,第 3.04 课:向部署组添加目标,摘要, 在前两章中,我们讨论了持续集成和交付的概念,并简要探讨了 Azure Pipelines 的概念
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多