大白话之ThreadLocal

2024-04-22 00:20
文章标签 threadlocal 大白话

本文主要是介绍大白话之ThreadLocal,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ThreadLocal是什么?

一般情况下,我们创建的变量可以被任何线程访问并且修改。如果线程需要有自己的一个本地变量怎么办?

ThreadLocal就是做这个事情的,它允许你创建的变量值对于使用该变量的每个线程来说都是独立的。可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。

ThreadLocal原理了解麻?

Thread类内部维护了一个ThreadLocalMap,可以说是ThreadLocal实现的一个定制化hashMap,它以ThreadLocal为key,以ThreadLocal储存的值为value,当我们的当前线程中的ThreadLocal调用set()或者get()方法时,会先判断当前的ThreadLocalMap是否存在,因为默认是null,如果不存在,就创建一个新的ThreadLocalMap并将其与当前线程关联。实际上set与get方法的调用其实是调用的ThreadLocalMap的set与get方法。

我们最终的变量其实放在了ThreadLocalMap中,并不是存在ThreadLocal中!

每个Thread中都具备一个ThreadLocalMap,而ThreadLocalMap可以存储以ThreadLocal为 key ,Object 对象为 value 的键值对。

ThreadLocal内存泄漏问题是怎么导致的?

 如果我们的使用的是线程池中的线程,那么当任务完成时,线程并不会销毁,依然存活,那么我们的ThreadLocalMap也就不会被GC回收,也就造成了内存泄漏,更严重的时下一次该线程如果在次存入新的ThreadLocal,依然不会被回收,如此以往就会造成OOM!

当然即使不使用线程池也会造成内存泄漏问题,主要是因为ThreadLocalMap中的key是弱引用,而value属于强引用,当我们的GC进行垃圾清楚时,会将弱引用的key回收,但是不会回收value,只要我们的Thread还存活,那我们的ThreadLocalMap也会一直存活,即使key值被回收,但是value仍然会存活,这就会造成对象的不可达,出现内存泄漏的问题。

解决这个问题通常需要手动调用 ThreadLocalremove() 方法,这样可以清除当前线程 ThreadLocalMap 中对应的条目。

总结:

1. ThreadLocal是Java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据

2. ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象(注意不是ThreadLocaI对象)中都存在一个ThreadLocalMap, Map的key为ThreadLocal对象, Map的value为需要缓存的值

3.Threadl ocal经典的应用场景就是连接管理(一个线程持有一一个连接, 该连接对象可以在不同的方法之间进行传递,线程之间不共享同一一个连接)

 

这篇关于大白话之ThreadLocal的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924400

相关文章

线程--(1)ThreadLocal简单使用

一、概念 ThreadLocal概念:线程局部变量,是一种并发线程访问变量的解决方案,与synchronized等加锁不同,ThreadLocal完全不提供锁,而使用空间换取时间的方式,为每一个线程变量提供一个副本,以保证线程之间的安全,因为它们之间是相互独立的。 二、代码说明 package com.flx.king.it_201707;/*** 功能:ThreadLocal的使

J.U.C Review - ThreadLocal原理源码分析

文章目录 一致性问题一致性问题简介解决一致性问题的常见方法 ThreadLocal什么是 ThreadLocalThreadLocal 的 线程模型ThreadLocal 的工作原理使用场景ThreadLocal 的基本 API1. 构造函数 `ThreadLocal()`2. 初始化方法 `initialValue()`3. 访问器 `get()` 和 `set()`4. 回收方法 `re

多线程 | ThreadLocal源码分析

文章目录 1. ThreadLocal解决了什么问题数据隔离避免参数传递资源管理 2. ThreadLocal和Synchronized3. ThreadLocal核心核心特性常见方法使用场景注意事项 4. ThreadLocal如何实现线程隔离的?(重点)ThreadLocal 的自动清理与内存泄漏问题阿里巴巴 ThreadLocal 编程规约 5. ThreadLocal源码分析Thre

大白话【12】网络虚拟化

1.VMware网络三种工作模式 1.桥接网络:虚拟一个交换机在内存里面(ovs),叫vmnet0如果你的物理机可以上外网,那么虚拟机也可以上外网2.NAT网络:将内网转换成外网叫vmnet8桥接和NAT既然都可以上外网,那么如何选择呢?桥接,不仅可以上外网,同时外网也可以访问到你的虚拟机NAT可以上外网,但是默认外网无法访问到你的虚拟机3.仅主机网络:vmnet1主要是为了安全,进行内网,外

Java 面试题:从源码理解 ThreadLocal 如何解决内存泄漏 ConcurrentHashMap 如何保证并发安全 --xunznux

文章目录 ThreadLocalThreadLocal 的基本原理ThreadLocal 的实现细节内存泄漏源码使用场景 ConcurrentHashMap 怎么实现线程安全的CAS初始化源码添加元素putVal方法 ThreadLocal ThreadLocal 是 Java 中的一种用于在多线程环境下存储线程局部变量的机制,它可以为每个线程提供独立的变量副本,从而避免多个线

大白话说什么是“MLLM”多模态大语言模型

1. 什么是MLLM多模态大语言模型 1.1 先来思考一个问题 如果上传了一张图片,并向大模型提问。“图片中绿色框框中的人是谁?” 大模型回答:“那是波多野吉衣老师” 请问,大模型是怎么做到的? 我们用常规的思路来想一下,难道是: 第一步:先对图片进行目标检测,先把绿色框的内容剪切出来; 第二步:在剪切后的图片中,把人脸标记出来,并读取其landmark转为向量; 第三步:在人脸向

ThreadLocal 在线程池中的内存泄漏问题

ThreadLocal 是一种非常方便的工具,它为每个线程创建独立的变量副本,避免了线程之间的共享数据问题。然而,在线程池环境中,ThreadLocal 的使用必须非常谨慎,否则可能会引发内存泄漏问题。 为什么 ThreadLocal 可能导致内存泄漏? 要理解 ThreadLocal 的内存泄漏问题,首先需要了解其工作原理: ThreadLocalMap:每个线程都维护一个 Thread

ThreadLocal用法和实现原理

http://www.cnblogs.com/alphablox/archive/2013/01/20/2869061.html

ThreadLocal: Java中的线程局部变量

在多线程编程中,确保数据的线程安全是一个重要的考虑因素。Java 提供了多种机制来处理线程安全问题,其中 ThreadLocal 是一种简单而强大的工具,用于创建线程局部变量,从而避免了同步操作的开销。本文将详细介绍 ThreadLocal 的概念、使用场景、最佳实践以及如何避免潜在的问题。 什么是ThreadLocal? ThreadLocal 是 Java 提供的一个类,它允许线程拥有自己

JUC并发编程-ThreadLocal

1、简介 ThreadLocal 是 Java 中一个重要的工具类,主要用于在多线程环境中提供线程局部变量。这意味着,每个线程都可以拥有自己的变量副本,而不会与其他线程共享这些变量,从而实现线程间的数据隔离。 总结: 线程局部变量:ThreadLocal 中填充的变量属于当前线程,对其他线程而言是隔离的。副本独立:每个线程都有自己的实例副本,且只能由当前线程使用。变量隔离:由于每个线程都有独