随笔 - 19,  文章 - 0,  评论 - 4,  阅读 - 491

什么是ThreadLocal,看作者的这一段话

 * This class provides thread-local variables.  These variables differ from

 * their normal counterparts in that each thread that accesses one (via its

 * {@code get} or {@code set} method) has its own, independently initialized

 * copy of the variable.  {@code ThreadLocal} instances are typically private

 * static fields in classes that wish to associate state with a thread (e.g.,

 * a user ID or Transaction ID).

每个线程都有一个独属于自己的变量,并且可以通过简单的方式进行管理。

为什么可以做到线程私有呢?

在源码Thread.java中定义了一个变量 threadLocals

    /* ThreadLocal values pertaining to this thread. This map is maintained

     * by the ThreadLocal class. */

    ThreadLocal.ThreadLocalMap threadLocals = null;

它是线程实例的一部分,不会被其它线程访问到。

重点操作

可以理解的是最终的操作落到了ThreadLocal.ThreadLocalMap threadLocals上,主要对 ThreadLocalMap所实现的操作进行讨论。

get

        private Entry getEntry(ThreadLocal<?> key) {

            int i = key.threadLocalHashCode & (table.length - 1);

            Entry e = table[i];

            if (e != null && e.get() == key)

                return e;

            else

                return getEntryAfterMiss(key, i, e);

        }

通过 Entry.value就可以获取相应 ThreadLocal的值了。

set

        private void set(ThreadLocal<?> key, Object value) {

  

            // We don't use a fast path as with get() because it is at

            // least as common to use set() to create new entries as

            // it is to replace existing ones, in which case, a fast

            // path would fail more often than not.

  

            Entry[] tab = table;

            int len = tab.length;

            int i = key.threadLocalHashCode & (len-1);

  

            for (Entry e = tab[i];

                 e != null;

                 e = tab[i = nextIndex(i, len)]) {

                ThreadLocal<?> k = e.get();

  

                if (k == key) {

                    e.value = value;

                    return;

                }

  

                if (k == null) {

                    replaceStaleEntry(key, value, i);

                    return;

                }

            }

  

            tab[i] = new Entry(key, value);

            int sz = ++size;

            if (!cleanSomeSlots(i, sz) && sz >= threshold)

                rehash();

        }

通过hash散列算法将不同的ThreadLocal存入hash table。(还没弄明白这个算法)

问题

  • hash散列算法是什么?   private static final int HASH_INCREMENT = 0x61c88647;这个特殊的数字有什么含义?
  • Entery中的key是弱引用,垃圾回收,value是强引用,这些有什么关联?
     static class Entry extends WeakReference<ThreadLocal<?>> {

            /** The value associated with this ThreadLocal. */

            Object value;

  

            Entry(ThreadLocal<?> k, Object v) {

                super(k);

                value = v;

            }

        }
posted on   嗯嗯好傅  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示