安博电竞竞猜网站_安博电竞吧_anggame安博电竞app
安博电竞竞猜网站

来生缘,男明星图片-安博电竞竞猜网站_安博电竞吧_anggame安博电竞app

admin admin ⋅ 2019-07-12 00:32:23



面试官:说说你对ThreadLocal的了解...

咱们该怎样答复????

  • ThreadLocal用在什么当地?
  • ThreadLocal一些细节!
  • ThreadLocal的最佳实践!


关于ThreadLocal,我之前也写过一篇文章剖析 Java面试必问,ThreadLocal终极篇

思许章润考

ThreadLocal用在什么当地?

评论ThreadLocal用在什么当地前,咱们先明晰下,假如只是就一个线程,那么都不必谈ThreadLocal的,ThreadLocal是用在多线程的场景的!!!

ThreadLocal概括下来就2类用途:

  • 保存线程上下文信息,在恣意需求的当地能够获取!!!
  • 线程安全的,防止某些状况需求考虑线蛇性程安全有必要同步带来的功能丢失!!!

保存线心跳频率与年纪对照表程上下文信息,在恣意需求的当地能够获取!!!

因为ThreadLocal的特性,同一线程在某当地进行设置,在随后的恣意当地都能够获取到。然后能够用来保存线程上下文信息。

常用的比方每个恳求怎样把一串后续相关起来,就能够用ThreadLocal进行set,在后续的恣意需求记载日志的办法fgoc狐里边进行get获取到恳求id,然后把整个恳求串起来。

还有比方Spring的事务管理,用ThreadLocal存储Connection,然后各个DAO能够获取同一Connection,能够进行事务回滚,提交等操作。

补白:ThreadLocal的这种用途,许多时分是用在一些优异的结构里边的,一般咱们很少触摸,反而下面的场景咱们触摸的更多一些!

线程安全的,防止某些状况需求考虑线程安全有必要同步带来的功能丢失!!!

Thread尤小刚周庭伊有孩子Local为处理多线程程序的并发问题供给了一种新的思路。可是ThreadLocal也有局限性,咱们来看看阿里标准:

每个线程往ThreadLocal中读写数据是线程阻隔,相互之间不会影薄翅蝉响的,所以ThreadLocal无法处理同享目标的更新问题!

因为不需求同享信息,天然就不存在竞赛问题了,然后确保了某些状况下线程的安全,以及防止了某些状况需求考虑线程安全有必要同来生缘,男明星图片-安博电竞竞猜网站_安博电竞吧_anggame安博电竞app步带来的功能丢失!!!

这类场景阿里标准里边也说到了:

ThreadLocal一些细节!

ThreaLocal运用示例代码:

public

class

ThreadLocalTest

{

private

static

ThreadLocal
<
Integer
>
threadLoc斯连教国al
=

new

ThreadLocal
<>();

public

static

void
main
(
String
[]
args
)

{

new

Thread
(()

->

{

try

{

for

(
int
i
=

0
;
i
<

100
;
i
++)

{
threadLocal
.
set
(
i
);

System
.
out
.
println
(
Thread
.
currentThread
().
getName
()

+

"===="

+
threadLocal
.
get
());

try

{

Thread
.
sle小狂系列ep
(
200
);来生缘,男明星图片-安博电竞竞猜网站_安博电竞吧_anggame安博电竞app

}

catch

(
InterruptedException
e
)

{
e
.
printStackTrace
();

}

}

}

finally

{
threadLocal
.
remov傅海棠最新消息e
();

}

},

"threadLocal1"
).
start
();

new

Thread
(()
少女影院
->

{

try

{

for

(
int
i
=

0
;
i
<

100
;
i
++)

{

System
.
out
.
println
(
Thread
.
currentThread
().
getName
()

+

"===="

+
threadLocal
.
get
());

try

{

Thread
.
sleep
(
200
);

}

catch

(
InterruptedException
e
)

{
e罗悠真
.
printStackTrace
();

}

}

}

final温州淘宝店东猝死事情ly

{
threadLocal
.
remove
();

}

},

"threadLocal2"
).
start
();

}
}

代码截图:

代码运转成果:

从运转的成果咱们能够看到threadLocal1进行set值对thre春之望adLocal2并没有任何影响!

Thread、ThreadLocalMap、ThreadLocal总览图:

Thread类有特点变量threadLocals (类型是ThreadLocal.ThreadLocalMap),也便是说每个线程有一个自己的ThreadLocalMap ,所以每个线程往这个ThreadLoc庞克莱门捷夫al中读写阻隔的,而且是相互不会影响的。

一个ThreadLocal只能存储一个Object目标,假如需求存储多个Object目标那么就需求多个ThreadLocal!!!

如图:

看到sgnb上面的几个图,大约思路应该都明晰了,咱们Entry的key指向ThreadLocal用虚闲王的盲妃线表示弱引证 ,下面咱们来看看ThreadLocalMap:

java目标的引证包含 :强引证,软引证,弱引证,虚引证 。

因为这儿涉及到弱引证,简略阐明下:

弱引北美时报用也是用来描绘非必需目标的,当JVM进行废物收回时,不管内存是否足够,该目标只是被弱引证相关,那么就会被收回。

当石萱只是只要ThreadLocalMap中的Entry的key指向ThreadLocal的时分,ThreadLocal会进行收回的!!!

ThreadLocal被废物收回后,在ThreadLocalMap里对应的Entry的键值会变成null,可是Entry是强引证,那么Entry里边存储的Object,并没有办法进行收回,所以ThreadLoc来生缘,男明星图片-安博电竞竞猜网站_安博电竞吧_anggame安博电竞appalMap 做了一些额定的收回作业。

尽管做了可是也会存在内存走漏危险(我没有遇到过,网上许多相似场景,所以会说到后边的ThreadLocal最佳实践!!!

ThreadLocal的最佳实践!

ThreadLocal被废物收回后,在ThreadLocalMap里对应的Entry的键值会变成null,可是Entry是强引证,那么Entry里边存储的Object,并没有办法进行收回,所以ThreadLocalMap 做了一些额定的收回作业。

补白:许多时分,咱们都是用在线程池的场景,程序不中止,线程根本不会毁掉!!来生缘,男明星图片-安博电竞竞猜网站_安博电竞吧_anggame安博电竞app!

因为线程的生命周期很长,假如咱们往ThreadLocal里边set了很大很大的Object目标来生缘,男明星图片-安博电竞竞猜网站_安博电竞吧_anggame安博电竞app,尽管set、get等等办法在特定的条件会调用进行额定的整理,可是ThreadLocal被废物收回后,在ThreadLocalMap里对应的Entry的键值会变成null,可是后续在也没有操作set、get等办法了。

所以最佳实践,应该在咱们不运用的时分,自动调用remove办法进行整理。

这儿把ThreadLocal界说为static还有一个优点便是,因为ThreadLocal有强引证在,那么在ThreadLocalMap里对应的Entry的键会永久存在,那么履行remove的时分就能够正确进行定位到而且删去!!!

最佳实践做法应该为:

笼统为:

try

{

// 其它事务逻辑
}

finally

{
th傅海棠最新消息readLocal
目标.
remove
();
}

考虑

假如面试的时分,能够把上面的内容都能够讲到,个人觉得就十分好了,答复的就挺完美了。可是假如你能够进行下面的答复,那么就更完美了。

关于ThreadLocal,我在看Netty源码的时分,还来生缘,男明星图片-安博电竞竞猜网站_安博电竞吧_anggame安博电竞app了解过FastThreadLocal,xxxxx一些列内容,那便是一个晋级了。

在本地进行测验中,FastThreadLocal的吞吐量是jdkThreadLocal的3倍左右。

小编为我们预备了一些适合于1-5年以上开发经历的程序员面试涉及到的绝大部分面试题及答案做成了文档和学习笔记文件以来生缘,男明星图片-安博电竞竞猜网站_安博电竞吧_anggame安博电竞app及架构视频材料免费共享给我们,期望能够协助到我们

转发此文,重视并私信小编“材料”可免费获取悉数学习材料

相关新闻

admin

admin

TA太懒了...暂时没有任何简介

精彩新闻