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++。

二 结语

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

相关文章
|
8月前
|
存储 Java Spring
ThreadLocal用法
ThreadLocal用法
62 0
|
8月前
|
存储 安全 Java
面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
字节面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
94 0
|
5月前
|
Java
【多线程面试题十五】、synchronized可以修饰静态方法和静态代码块吗?
这篇文章讨论了Java中的`synchronized`关键字是否可以修饰静态方法和静态代码块,指出`synchronized`可以修饰静态方法,创建一个类全局锁,但不能修饰静态代码块。
|
6月前
|
存储 算法 Java
ThreadLocal 源码浅析
【7月更文挑战第5天】`ThreadLocal` 是Java中用于创建线程局部变量的工具类,确保每个线程拥有独立的变量副本。源码中,每个`ThreadLocal`实例都有一个唯一的哈希码用于映射到`ThreadLocalMap`,这个内部静态类使用弱引用存储键(`ThreadLocal`实例)以防止内存泄漏。`ThreadLocalMap`使用 Entry 数组,Entry 是一个扩展了 WeakReference 的类,持有线程变量值。`ThreadLocal`的`get()`和`set()`方法通过哈希计算定位并访问或设置线程局部变量。
|
8月前
|
Java
Synchronized实现原理(方法代码块)
Synchronized实现原理(方法代码块)
73 0
|
Java 编译器
复习篇【类的构造方法与代码块的执行】
复习篇【类的构造方法与代码块的执行】
复习篇【类的构造方法与代码块的执行】
|
存储 安全 Java
|
Java 数据库
ThreadLocal的使用和坑点
ThreadLocal的使用和坑点
208 0
|
安全 Java 关系型数据库
大神们是怎么使用ThreadLocal的?
这篇文章是关于ThreadLocal的第三篇文章。本文将挑选一些主流的Java开源框架,从源码上分析,大神们是如何使用ThreadLocal的,学习他们的设计思想。
198 0
|
前端开发 Java 程序员
彻底读懂ThreadLocal与Synchronized区别(代码案例详解)
📝本篇用案例代码带初学者彻底读懂ThreadLocal与Synchronized区别!
173 0
彻底读懂ThreadLocal与Synchronized区别(代码案例详解)