zoukankan      html  css  js  c++  java
  • ThreadLocal之我见

      一直都对ThreadLocal类感觉隔层纱似的,因为在开发中几乎是没有用到过,也大体知道他是用来保存一个线程范围内有效的变量。甚至觉着它的实现就是类似于一个map,以线程id作为key,要保存的变量作为value。但当时看源代码,并不是自己想象的那样。由于几乎不用也一直没仔细看看源码。今天偶然的机会仔细的看了一下源代码,但它的关系结构跟自己想象的出入很大,这是我简单绘制的一个关系图:

      简单描述下就是,Thread对象有一个指向ThreadLocalMap实例的threadLocals成员,ThreadLocalMap有一个Entry数组用来盛放数据,Entry的key是ThreadLocal实例,value就是本地线程变量。

      其实说白了,不同线程的本地线程变量都是绑定在自己身上的,并没有统一放在一起。而ThreadLocal实例仅仅是作为entry的key。ThreadLocal实例是被多个线程共享作为entry的key的。用ThreadLocal作为entry的key确实让我感到莫名其妙,也一下子想不明白为何如此设计呢?

      以下是我的个人见解:

      第一,可以做到一个线程有多个threadlocal实例作为key,也就可以有多个本地线程变量了。如果以线程id为key的map形式保存本地线程变量就只能是一个了。

      第二,本地线程变量都是私有携带在线程实例里边,仅仅是以线程共享的threadlocal实例作为key。所以访问、移除本地线程变量时,就不存在任何并发同步问题了。

  • 相关阅读:
    新版《星光大道》
    acl 3.1.2版本发布,网络通信与服务器编程框架
    批量将 *.c 预处理为 *.i (递归处理文件夹中所有文件)gcc -E
    texmaker——unknown graphics extension .eps
    TexMaker
    中国计算机学会推荐国际学术会议和期刊目录
    浅谈阶梯博弈
    【hdu 3389】Game
    【hdu 3537】Daizhenyang's Coin
    【hdu 3863】No Gambling
  • 原文地址:https://www.cnblogs.com/metoy/p/3936128.html
Copyright © 2011-2022 走看看