ThreadLocal源码分析,++i

简介: ThreadLocal源码分析,++i

一 前言

千呼万唤始出来,犹抱琵琶半遮面
在代码的世界里,陌生永远都应该是这条路上最熟悉的词,因为只有陌上才能拓宽,只有陌生,才更有挑战。
好的,不白话了,说说ThreadLocal中遇到的好东西,我们常说的 ++i登场了。
之前我有写过i++和++i通过字节码的解释,但是并没有在程序中看到++i的使用场景,结果今天遇到了。

二 代码

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

  还是这个set方法 int sz = ++size; 看到后我挺惊讶的,因为工作了几年就没见过++i的使用,然后回想下,i++ 与 ++i

   居然迷惘了,i++ 是从局部变量表中取数据放入栈,然后对局部变量表+1,然后读取栈的数据,那栈的数据不变,如果这样的话,下面的代码岂不是最终输出都是0;

int i = 0;
for(int j =0;j<10;j++){
    System.out.println(i++);
}

  然后输出打印 是 0 1 2······ 和我想的不一样,最终想到了为什么,因为虽然读取了栈的值,但是对局部变量表的+1 也不是白家的。上面的局部变量还是加了1。

  然后我们说说为什么使用++size,使用++i 其实还有一个好处就是性能,如果通过查看字节码来解释就是 ++i是在栈中对数据+1 而不是在局部变量表+1 所以更快一些。

相关文章
|
6月前
|
存储 安全 Java
面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
字节面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
78 0
|
3月前
|
存储 设计模式 安全
深入理解ThreadLocal原理
本文深入探讨了Java中的ThreadLocal及其内部数据结构ThreadLocalMap的工作原理和特性,帮助读者理解如何利用ThreadLocal实现线程局部变量的隔离和线程安全。
深入理解ThreadLocal原理
|
4月前
|
存储 算法 Java
ThreadLocal 源码浅析
【7月更文挑战第5天】`ThreadLocal` 是Java中用于创建线程局部变量的工具类,确保每个线程拥有独立的变量副本。源码中,每个`ThreadLocal`实例都有一个唯一的哈希码用于映射到`ThreadLocalMap`,这个内部静态类使用弱引用存储键(`ThreadLocal`实例)以防止内存泄漏。`ThreadLocalMap`使用 Entry 数组,Entry 是一个扩展了 WeakReference 的类,持有线程变量值。`ThreadLocal`的`get()`和`set()`方法通过哈希计算定位并访问或设置线程局部变量。
|
6月前
|
存储 安全 Java
ThreadLocal原理讲解
ThreadLocal原理讲解
56 0
|
存储 SpringCloudAlibaba Java
浅析ThreadLocal使用及实现原理
提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其`get` 或 `set`方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。`ThreadLocal`实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联 。所以ThreadLocal与线程同步机制不同,线程同步机制是多个线程共享同一个变量,而ThreadLocal是为每一个线程创建一个单独的变量副本,故而每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程所对应的副本。可以这么说Th
109 0
浅析ThreadLocal使用及实现原理
|
存储 Java 数据安全/隐私保护
ThreadLocal的实现原理&源码解析
ThreadLocal是Java中的一个线程封闭机制,它提供了一种线程局部变量的解决方案,可以使每个线程都拥有自己独立的变量副本,互不干扰。
93 0
|
存储 安全 Java
ThreadLocal源码分析
ThreadLocal,即线程局部变量。主要用于线程间数据隔离。这些变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型。ThreadLocal不是为了解决多线程访问共享变量,而是为每个线程创建一个单独的变量副本,提供了保持对象的方法和避免参数传递的复杂性。
|
存储 算法 安全
ThreadLocal原理剖析
ThreadLocal原理剖析
222 0
|
Java 定位技术
ThreadLocal原理
经典八股文之ThreadLocal原理
190 0
|
存储 Java Kotlin
ThreadLocal实现原理分析
ThreadLocal实现原理分析
ThreadLocal实现原理分析