首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
ThreadLocal 的用法和实现原理。
[问答题]
ThreadLocal 的用法和实现原理。
查看答案及解析
添加笔记
求解答(0)
邀请回答
收藏(212)
分享
纠错
59个回答
添加回答
74
牛客378902586号
ThreadLocal有个很关键的点就是内存泄漏问题,可以去看看,会让面试官眼前一亮的
发表于 2022-05-06 21:46:02
回复(3)
36
十七_
ThreadLocal,即线程变量,它将需要并发访问的资源复制多份,让每个线程拥有一份资源。由于每个线程都拥有自己的资源副本,从而也就没有必要对该变量进行同步了。
发表于 2022-04-27 10:49:23
回复(0)
33
Chaos1874
ThreadLocal即线程变量,它用于共享变量在多线程中的隔绝,即每个线程都有一个该变量的副本彼此互不影响也就不需要同步机制了,实现原理:每个Thread对象中都有一个ThreadLocal类的内部类ThreadLocalMap对象,他是一个键值形式的容器,以ThreadLocal对象的get和set方法来存取共享变量值,原理时:以ThreadLocal对象作为key来存取共享变量值。一个ThreadLocal用完后必须remove,否则会造成内存泄漏。
发表于 2022-05-18 16:00:01
回复(2)
26
卡农变骤
ThreadLocal是线程变量,它将需要共享的数据复制多份,每个线程各一份。内部使用了一个ThreadLoadMap来存储信息,key是当前线程,而value是我们需要传输的数据,我们可以在线程执行的过程中通过get/set,操作map中的数据,不过需要注意的是在使用线程池的时候,线程执行完毕不会被销毁,而是进入线程池中等待,这个时候我们需要手动释放一下map中的数据,以免造成内存浪费。
发表于 2022-06-21 14:15:53
回复(1)
6
小森哥mini
1. ThreadLocal是Java中所提供的线程本地存储机制,可以利⽤该机制将数据缓存在某个线程内部, 该线程可以在任意时刻、任意⽅法中获取缓存的数据 2. ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象(注意不是ThreadLocal对象)中都存在⼀个ThreadLocalMap,Map的key为ThreadLocal对象,Map的value为需要缓存的值 3. 在线程池中使⽤ThreadLocal会造成内存泄漏,因为当ThreadLocal对象使⽤完之后,应该要 把设置的key,value,也就是Entry对象进⾏回收,但线程池中的线程不会回收,⽽线程对象是通过强引⽤指向ThreadLocalMap,ThreadLocalMap也是通过强引⽤指向Entry对象,Entry对象也就不会被回收,从⽽出现内存泄漏,解决办法是,在使⽤了ThreadLocal对象之后,⼿动调⽤ThreadLocal的remove⽅法,⼿动清除Entry对象 4. ThreadLocal经典的应⽤场景就是连接管理(⼀个线程持有⼀个连接,该连接对象可以在不同的⽅法之间进⾏传递,线程之间不共享同⼀个连接)
编辑于 2022-07-02 16:05:49
回复(0)
6
牛客732147750号
共享变量在每个线程都有一个副本,每个线程操作的都是自己的副本,对另外的线程没有影响。, ThreadLocal提供了线程安全的共享机制,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal.
发表于 2022-06-06 18:59:13
回复(0)
5
牛客_正
抓住关键词:线程变量、资源复制(副本)、线程隔离
发表于 2022-06-18 20:09:17
回复(0)
3
木一猿猴
三者都是引用数据类型,都是对字符串功能相关操作的类,但三者还是有一定区别。1、对象创建上的区别:String可以直接字符串赋值创建,也可以new String()创建,前者会去字符串常量池获取,倘若没有则会在常量池中创建,后者则会在堆中创建一个对象,而且如果常量池没有,也会在常量池中创建一个。StringBuilder和StringBuffer都需要new对象才可以,两者都是继承AbstractStringBuilder类。2、值是否可变的区别:String是由于内部属性有final的原因,其是不可变类,其值是不会改变的,倘若想改变值,就必须将引用改变。StringBuilder和StringBuffer是值可变的,在引用不变的情况下,对堆中的值进行修改,常用的有append()等方法。这里有个注意点就是,String+的内部原理其实是用到StringBuilder.append()方法。3、数据拼接速度的区别:其实追究到底就是stringBuilder和StringBuffer之间的比较,由于后者是线程安全的,有锁机制,其速度是比前者慢的。而在String+的情况下,当只是一个语句不断相加,那其是只会new一个StringBuilder,然后用append()方法,但如果是在循环中+=的形式,那其原理是不断创建StringBuilder,append然后toString(),效率是会降低很多。4、线程安全区别:String由于是不可变的,所以其是线程安全的,StringBuilder是线程不安全的,StringBuffer是线程安全的。
编辑于 2022-05-18 17:26:02
回复(1)
2
在攒经验的菠萝蜜很积极
ThreadLocal,即线程局部变量,它将需要并发访问的资源复制多份,让每个线程拥有一份资源。由于每个线程都拥有自己的资源副本,从而也就没有必要对该变量进行同步了。
编辑于 2022-09-17 10:41:30
回复(0)
2
阐禅
bean的生命周期主要有四步:创建,初始化,调用,销毁。 首先说创建bean的方式也有不同,通过构造器,静态工厂(工厂本身不需要创建),实力工厂(工厂需要创建对象),还有setter注入方式。 spring在调用bean的时候,因为作用域的不同,bean的创建时间也不相同,当作用域为singleton的时候,bean在容器实例化好的时候就创建了,spring直接调用即可,作用域为prototype的时候,bean是在被spring调用的时候,bean在被调用的时候创建,并且初始化完成,然后才可以被应用程序使用,直到应用程序被销毁,bean的生命周期结束。
编辑于 2022-05-08 16:53:46
回复(3)
1
舒文宾
ThreadLocal即线程变量,用于在多线程环境中隔离共享变量,使每个线程都有该变量的一个副本,互不影响,从而无需同步机制。其实现原理是:每个Thread对象中都有一个ThreadLocal类的内部类ThreadLocalMap对象,它是一个键值形式的容器,以ThreadLocal对象为键存取共享变量值。每个线程在访问ThreadLocal变量时,实际上是在访问自己线程中的ThreadLocalMap中的值。使用完ThreadLocal后必须调用remove方法,以避免潜在的内存泄漏问题,因为ThreadLocalMap使用弱引用来引用ThreadLocal对象,但其值对象是强引用,可能导致ThreadLocal对象被回收后,值对象不能及时被回收。
发表于 2024-06-12 19:45:09
回复(0)
1
你说是那就是
答: threadlocal即线程变量,它将需要并发访问的资源复制多份,让每个线程拥有一份资源。由于每个线程都拥有自己的资源副本,从而也就没有必要对该变量进行同步了。本质上是线程内部存储类,从而实现线程数据隔离。 存在内存泄露问题,Java对象的四种引用类型:强引用、软引用、弱引用、虚引用。 强引用:最为普通的引用方式,表示一个对象处于有用且必须的状态,如果一个对象具有强引用,则GC不会回收它。即便堆中内存不足了,宁可出现OOM,也不会对其进行回收。 软引用:表示一个对象可能有用且非必须的状态。只要内存足够,不回收。 弱引用:表示一个对象可能有用且非必须的状态。当GC线程扫描内存区域时,一旦发现弱引用,就会回收到弱引用相关联的对象。无关内存区域是否足够,一旦发现就会回收。 虚引用:形同虚设,与其他引用不同,虚引用不会决定对象回收。
编辑于 2024-03-28 09:35:48
回复(0)
1
大星星不见了
ThreadLocal 是线程变量。访问这个变量的每个线程都会有这个变量的本地副本。
发表于 2023-03-28 15:27:51
回复(0)
1
杨照光
ThreadLocal可以理解为线程本地变量,可以为每一个线程分配一个副本变量,线程访问这个副本变量即可,做到了线程之间相互隔离。 ThreadLocal里有一个静态内部类ThreadLocalMap,ThreadLocalMap实际上就是以ThreadLcoal对象为key,具体变量为value 的一个Entry对象,这个Entry对象继承了WeakReference弱引用,将 Entry对象的key ,也就是ThreadLocal对象设置成了弱引用。 使用弱引用的原因就是为了防止内存泄漏,保证在一下次GC的时候能够及时回收,但即使使用弱引用如果操作不当,还有可能会造成内存泄漏,假如key指向的ThreadLocal被回收,那么Entry数组保存了一个key为nul,value有值的一个Entry对象。但是这个Entry对象永远也不会被访问,因此在使用完ThreadLocal时,一定要使用remove方法进行清除。
发表于 2023-03-02 10:47:48
回复(0)
1
Java开发外卖员
1:线程间用ThreadLocal可以实现[资源对象]线程隔离 2:线程内使用ThreadLocal可以共享线程内资源 每一个线程都有一个ThreadLocal,以及set,get,remove方法,ThreadLocal是弱引用
发表于 2023-02-23 19:11:31
回复(0)
1
ttccq
ThreadLocal即线程变量,它将需要共享访问的资源复制多份,让每个线程都拥有一份资源副本,从而也就没有必要对该变量进行同步了。在实现上,Thread类声明了threadLocals变量,该变量用于存放当期线程独占的资源。 ThreadLocal类定义了该变量的类型(ThreadLocalMap),这是一个类似于map的结构,用于存放键值对 ThreadLocal类还提供了get和set方法,set方法可以用于初始化ThreadLocalMap并将其绑定到Thread.threadLocals,从而将传入的值绑定到当前线程。传入的值作为value,key则是ThreadLocal对象本身(this) get方法没有参数,它是ThreadLocal对象本身为key,从 Thread.threadLocals 中获取与当前线程绑定的数据
发表于 2022-06-28 09:53:31
回复(0)
0
牛客152771347号
ThreadLocal是线程变量,它将需要共享的数据复制多份,每个线程各一份。内部使用了一个ThreadLoadMap来存储信息,key是当前线程,而value是我们需要传输的数据,我们可以在线程执行的过程中通过get/set,操作map中的数据,不过需要注意的是在使用线程池的时候,线程执行完毕不会被销毁,而是进入线程池中等待,这个时候我们需要手动释放一下map中的数据,以免造成内存浪费。
发表于 2025-05-20 14:08:35
回复(0)
0
_zmm
ThreadLocal线程上下文,在一个线程中可以set值,线程的执行过程中都可以通过get获取到set的值,线程之间的上下文不会相互影响,各自独立。 实现原理:底层维护了一个ThreadLocalMap,当线程调用ThreadLocal实际上是自己创建了一个map赋值给了ThreadLocalMap,线程操作的实际上是自己线程中的ThreadLocalMap对象,键是ThreadLocal实例,值是set的值。
发表于 2025-05-20 09:25:20
回复(0)
0
1027bb
ThreadLocal是 Java 提供的线程本地存储工具。使得每个线程可以独立地持有自己的变量副本,只能被自己线程去使用访问, 避免了多线程之间的同步问题。 theardlocal的结构:每个线程Thread维护一个ThreadlocalMap,使用hash表存,存储的entry元素中key就是该threadlocal实例,值就是set()存的值。 当在线程池中使用threadlocal时要注意要remove 释放销毁entry 防止内存的泄漏
发表于 2025-05-12 23:25:38
回复(0)
0
主动的小松鼠在考古
ThreadLocal用来存贮各个线程独有的变量,ThreadLocal会维护一个ThreadLocalMap内部类,ThreadLocalMap中的键存储的时当前ThreadLocal对象,值是要存储的变量,ThreadLocal对象是弱引用,会自动回收,ThreadLoaclMap中的值是强引用,会出现键为null的Eentry,如果使用线程池,线程没有被回收,ThreadLoaclMap中键为null的Entry就不会不会被回收,导致内存泄漏
发表于 2025-05-09 14:00:10
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
Java
上传者:
real1993
难度:
59条回答
212收藏
1363浏览
热门推荐
相关试题
无限长正整数排列字符串
枚举
评论
(1)
BFS
枚举
评论
(1)
多组输入a+b II
过关题目
语言题
评论
(2)
多组数据a+b III
过关题目
语言题
评论
(2)
素数判断
过关题目
语言题
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题