iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ThreadLocal的set方法原理是什么
  • 623
分享到

ThreadLocal的set方法原理是什么

2023-07-05 04:07:56 623人浏览 安东尼
摘要

这篇文章主要介绍了ThreadLocal的set方法原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ThreadLocal的set方法原理是什么文章都会有所收获,下面我们一起来看看吧。前沿知识Threa

这篇文章主要介绍了ThreadLocal的set方法原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ThreadLocal的set方法原理是什么文章都会有所收获,下面我们一起来看看吧。

前沿知识

  • ThreadLocal存储线程变量,使用set方法设置变量,使用get方法获取变量

  • 线程隔离的实现是每个Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals。如下图所示,ThreadLocalMap内部有一个Entry数组,每个Entry的key是ThreadLocal,也就是referent对象,value是设置的值;该类的size变量记录当前数组使用容量;threshold变量记录阈值,默认总容量的三分之二,初始是10

ThreadLocal的set方法原理是什么

  • threadLocal通过哈希算法决定落于哪一个EntryGC时,如果threadLocal没有引用,会被回收,即referent值为null,否则不回收,value不会回收,因此要使用remove方法删除对应Entry,否则可能会出现内存泄漏

set方法

ThreadLocal->set()

ThreadLocal的set方法原理是什么

第一种:如果线程第一次执行set方法,此时map为空,会创建。在此过程中初始化entry的个数为16,threshold为10,同时根据哈希值定位对应下标的entry并赋值

如果map不为空,走ThreadLocalMapset方法,根据哈希值找到对应的下标。从源代码中可知:

第二种:如果该下标为空,那么直接赋值

如果该下标不为空,那么从当前下标开始遍历,直到下一个entry为null时停止

第三种:如果entry的key是当前thread,直接替换值

第四种:如果循环结束,说明遇到了空entry,那么直接赋值到该下标

如果之前发生了GC,那么entry不为空,但是key为空,此时调用replaceStaleEntry方法

记录此下标为staleSlot、slotToExpunge变量,从当前下标的前一个entry开始遍历,直到entry为null时停止,如果有回收的entry,那么记录它的下标,赋值到slotToExpunge变量

从当前下标的后一个entry开始遍历,直到entry为null时停止

第五种:如果遇到了key相等的情况,那么替换值,该entry与staleSlot下标的entry交换。如果向前遍历没有找到回收的entry,那么记录并赋值到slotToExpunge变量。清理过期entry,最后返回

第六种:如果循环结束,说明遇到了空entry,也没有找到key相等的entry。那么清除staleSlot下标的value,然后新建entry。如果有记录过期entry,那么会清理,最后返回

赋值结束后,还会进行一次尝试清理,如果没有过期entry,并且当前容量大于等于阈值,走扩容rehash方法

清理与扩容

expungeStaleEntry(staleSlot):由于传入的下标staleSlot所在entry一定是GC之后的,因此会将entry的值设为null,随后删除entry。从下一个entry开始遍历,直到entry为null时停止,如果entry是GC过的,将value置为null,否则将key重新哈希和分配,这样的目的是使得entry离正确的下标位置更接近一些。最后返回entry为null的坐标

cleanSomeSlots(i,n):参数n一般是当前的size值。从i的下一个entry开始遍历,每遍历一次,n的值就减少一半,直到为0时停止。如果所在下标的entry是GC过的,那么会调用一次expungeStaleEntry(staleSlot)方法

rehash():首先调用一次清理方法,然后判断当前容量是否超过阈值的四分之三(约总容量的二分之一),然后才真正扩容,每次扩容一倍。循环遍历entry数组,如果entry发生GC,那么将值设置为null,否则将key重新哈希和分配,最后重新计算阈值和当前使用容量

关于“ThreadLocal的set方法原理是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“ThreadLocal的set方法原理是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: ThreadLocal的set方法原理是什么

本文链接: https://www.lsjlt.com/news/349371.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ThreadLocal的set方法原理是什么
    这篇文章主要介绍了ThreadLocal的set方法原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ThreadLocal的set方法原理是什么文章都会有所收获,下面我们一起来看看吧。前沿知识Threa...
    99+
    2023-07-05
  • Java中ThreadLocal的用法和原理是什么
    这篇文章主要介绍“Java中ThreadLocal的用法和原理是什么”,在日常操作中,相信很多人在Java中ThreadLocal的用法和原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Th...
    99+
    2023-07-06
  • ThreadLocal工作原理及用法是什么
    今天就跟大家聊聊有关ThreadLocal工作原理及用法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ThreadLocal是什么ThreadLocal是线程Thread中属性...
    99+
    2023-06-22
  • ThreadLocal使用方法是什么
    这篇“ThreadLocal使用方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ThreadLocal使用方法是什么...
    99+
    2023-06-29
  • Java多线程之ThreadLocal的原理是什么
    今天小编给大家分享一下Java多线程之ThreadLocal的原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、什...
    99+
    2023-07-06
  • ThreadLocal的原理和使用场景是什么
    ThreadLocal是Java中的一个类,用于在多线程环境中实现线程内部的数据共享。它提供了一个线程局部变量,每个线程都可以独立地...
    99+
    2023-09-12
    ThreadLocal
  • Java中ThreadLocal的原理是什么及怎么使用
    这篇文章主要介绍“Java中ThreadLocal的原理是什么及怎么使用”,在日常操作中,相信很多人在Java中ThreadLocal的原理是什么及怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jav...
    99+
    2023-07-06
  • Java中ThreadLocal线程变量的实现原理是什么
    这篇文章主要介绍了Java中ThreadLocal线程变量的实现原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中ThreadLocal线程变量的实现原理是什么文章都会有所收获,下面我们一起来看...
    99+
    2023-07-02
  • python set()去重的方法是什么
    这篇文章主要介绍了python set()去重的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python set()去重的方法是什么文章都会有所收获,下面我们一起来看看吧。set...
    99+
    2023-06-26
  • c++ set遍历的方法是什么
    在C++中,可以使用迭代器或者范围循环来遍历Set。1. 使用迭代器遍历Set:```cpp#include #include in...
    99+
    2023-09-15
    c++
  • Java中ThreadLocal的用法和原理详解
    目录用法实现原理内存泄漏用法 隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象。 package com.exam...
    99+
    2023-05-15
    Java ThreadLocal用法 Java ThreadLocal原理 Java ThreadLocal
  • __autoload()方法的工作原理是什么
    __autoload()方法的工作原理是:1.类文件的文件名和类的名字保持一致。2.根据实例化的类的名称来查找这个类文件的路径。3.在实例化前没有引入这个类文件会自动执行。4.不用写很多个include或者require函数。__autol...
    99+
    2024-04-02
  • java中的ThreadLocal是什么
    这篇文章将为大家详细讲解有关java中的ThreadLocal是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简单介绍ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线...
    99+
    2023-06-19
  • Java中ThreadLocal导致内存OOM的原因是什么
    本篇内容介绍了“Java中ThreadLocal导致内存OOM的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!原因分析Thread...
    99+
    2023-06-30
  • sql set的用法是什么
    在SQL中,SET是一个用于更新数据库表中的数据的关键字。它可以按照指定的条件更新表中的一列或多列的值。 SET语句的基本语法如下:...
    99+
    2024-04-09
    sql
  • js中new set()使用的方法是什么
    在JavaScript中,可以使用以下方法来使用`new Set()`:1. 创建一个空的Set对象:```javascriptco...
    99+
    2023-09-29
    js
  • openGauss的SCHEMA的原理及管理方法是什么
    这篇文章主要介绍“openGauss的SCHEMA的原理及管理方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“openGauss的SCHEMA的原理及管理方法是什么”文章能帮助大家解决问题。...
    99+
    2023-07-05
  • Java中HashMap的hash方法原理是什么
    本篇内容主要讲解“Java中HashMap的hash方法原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中HashMap的hash方法原理是什么”吧!来看一下 hash 方法的源...
    99+
    2023-06-25
  • c++中set遍历取值的方法是什么
    在C++中,可以使用迭代器来遍历set中的元素。具体方法如下: #include <iostream> #include...
    99+
    2024-03-04
    c++
  • java中set集合遍历的方法是什么
    在Java中,Set集合可以通过迭代器(Iterator)或者增强for循环(foreach)来进行遍历。 使用迭代器遍历Set集合...
    99+
    2024-03-04
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作