码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • ThreadLocal详解


    目录

    前言

    一、什么是ThreadLocal?

    二、底层源码

    三、 为什么Map的key要设置为弱引用?

    四、 Value怎么释放?

    五、ThreadLocal怎么实现隔离的?

    总结


    前言

    今天在看算法书中的hash表的时候,解决hash冲突那一块提到了这个概念,所以就想着记录一下

    一、什么是ThreadLocal?

    ThreadLocal是Thread上的局部变量,可以实现线程之间的隔离,线程内部资源之间的共享,是线程私有的

    ps:这里对线程私有公有做如下说明

      

    二、底层源码

    因为ThreadLocal是依附于Thread的,那么我们可以在这里首先看看Thread中对于ThreadLocal的定义

    1. ThreadLocalMap threadLocals;
    2. ThreadLocalMap inheritableThreadLocals;

    Thread内部维护了一个ThreadLocalMap的属性,那么什么是ThreadLocalMap?再来看看底层源码

    ThreadLocalMap是其静态的内部类,并且是缺省的,所以我们外部不能获取这个内部的对象,只可以通过ThreadLocal来操控。并且内部是由Entry构成,每个Entry数组的key是一个弱引用,value则不是。

    关于Entry可以查看:

    然后我们来看看ThreadLocal的内部方法: 

    我们发现如果去get的话,没有get到当前线程的map或者map里没有当前ThreadLocal的键的话,就会初始化一个map,并且将ThreadLocal作为key,null作为value初始化进去(和其他的map实现不同,它的get方法如果get不到的话还会set当前的TheadLocal进去,其他的map实现并没有修改map里的东西);如果获取到了当前线程里的map的话,则将key=ThreadLocal的value值取出来

     

    ThreadLocalMap的一些特点

    初始容量为16,扩容因子为 2/3,扩容容量翻倍

    采用开放寻址法解决冲突

    三、 为什么Map的key要设置为弱引用?

    软引用、强引用与弱引用

    强引用、弱引用、软引用、虚引用_young_man2的博客-CSDN博客

    四、 Value怎么释放?

    五、ThreadLocal怎么实现隔离的?

    在这里插入图片描述

    ThreadLocal之所以能达到变量的线程隔离,其实就是每个线程都有一个自己的ThreadLocalMap对象来存储同一个threadLocal实例set的值,而取值的时候也是根据同一个threadLocal实例去自己的ThreadLocalMap里面找,自然就互不影响了,从而达到线程隔离的目的!
     


    总结

    ThreadLocal属于Thread的私有的!

    ThreadLocalMap不存在的情况下会自动创建【使用get方法的时候】

  • 相关阅读:
    Camera驱动基础--硬件接口相关知识介绍
    UE5物体旋转(蓝图版)
    记录:Unity脚本的编写3.0
    inveta PLSB 点线面体 示例工程
    java面试题整理《基础篇》八
    羧酸研究:Lumiprobe 磺基花青7二羧酸
    [JDK8下的HashMap类应用及源码分析] 数据结构、哈希碰撞、链表变红黑树
    Jwt隐藏大坑,通过源码揭秘
    R语言使用plot函数可视化数据散点图,使用col参数自定义设置数据点的颜色、设置参数为颜色编码
    Go-Excelize API源码阅读(二十)——SetDefinedName
  • 原文地址:https://blog.csdn.net/young_man2/article/details/125896811
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号