ThreadLocal源码,骚气的for循环

简介: ThreadLocal源码,骚气的for循环

一 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();
}

这里面有一个for循环,很骚气,for循环不是应该for(int i=0;i<list.size();i++)吗? 或者是foreach的写法吗?

for (Entry e = tab[i];
     e != null;
     e = tab[i = nextIndex(i, len)])
     

就是这段骚气的for循环,仔细看了一下,这段代码其实就是for循环的基础变种,意思就是如果e!=null时就会一直执行下去Entry e = tab[i]是初始值,相当与i =0,e = tab[i = nextIndex(i, len)] 是一个变化的值,相当于i++。

二 结语

源码的阅读不是一蹴而就的,而是需要不断的循序渐进,如果太过着急,就一定会适得其反。

相关文章
|
3月前
|
存储 Java Spring
ThreadLocal用法
ThreadLocal用法
31 0
|
3月前
|
存储 安全 Java
面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
字节面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
55 0
|
1月前
|
存储 算法 Java
ThreadLocal 源码浅析
【7月更文挑战第5天】`ThreadLocal` 是Java中用于创建线程局部变量的工具类,确保每个线程拥有独立的变量副本。源码中,每个`ThreadLocal`实例都有一个唯一的哈希码用于映射到`ThreadLocalMap`,这个内部静态类使用弱引用存储键(`ThreadLocal`实例)以防止内存泄漏。`ThreadLocalMap`使用 Entry 数组,Entry 是一个扩展了 WeakReference 的类,持有线程变量值。`ThreadLocal`的`get()`和`set()`方法通过哈希计算定位并访问或设置线程局部变量。
|
9月前
|
算法 安全 Java
hashmap死循环原因总结
hashmap死循环原因总结
35 0
|
11月前
|
存储 安全 容器
为什么HashMap会产生死循环?
HashMap死循环是一个比较常见、也是比较经典的面试题,在大厂的面试中也经常被问到。HashMap的死循环问题只在JDK1.7版本中会出现,主要是HashMap自身的工作机制,再加上并发操作,从而导致出现死循环。JDK1.8以后,官方彻底解决了这个问题。
76 0
|
存储 安全 Java
聊聊hashmap在1.7情况下的多线程死循环问题
在Java 1.7版本中,HashMap的扩容过程存在一个多线程环境下的死循环问题。这个问题的具体原因是由于HashMap在进行扩容时,多个线程同时进行put操作,可能会导致链表形成环形结构,从而导致get操作陷入死循环。
139 0
|
存储 安全 Java
|
安全 Java
ThreadLocal相关知识点
ThreadLocal相关知识点
102 0
ThreadLocal相关知识点
|
Java 数据库
ThreadLocal的使用和坑点
ThreadLocal的使用和坑点
179 0
|
安全 Java 关系型数据库
大神们是怎么使用ThreadLocal的?
这篇文章是关于ThreadLocal的第三篇文章。本文将挑选一些主流的Java开源框架,从源码上分析,大神们是如何使用ThreadLocal的,学习他们的设计思想。
179 0