克罗地亚战警vs菲多,七星滑雪,宾俊杰身高
threadlocal是线程局部变量,不同线程的threadlocal相互独立。它是一种保存线程私有信息的机制,因为在现成的整个生命周期都有效,
所以可以方便地在一个线程关联的不同业务模块之间传递信息,比如事务id、cookie等上下文相关信息。
特点:
安全,线程安全。
threadlocal设计实现的优点:开箱即用,代码易读,符合经常阅读偶尔使用的原则
场景:资源持有、线程一致性、并发计算等多线程场景。
如jdbc事务的请求,part i 代表不同事务,如更新用户信息、更新订单信息等,需要保证各事务资源的一致性。
每一个事务请求连接时,先去threadlocal map里找,如果不存在,到连接池中请求分配连接,并存入map。
总结,threadlocal的主要作用是:
压力测试工具,apache2-util
虽然完成10000请求的速度变快了,但最终curl请求get到的数据会不一致。
原因是,多线程下,c是临界资源,c=c+1不具备原子性,要先读取c,在执行加1,再执行赋值。
测试发现curl get到的结果是10000,但速度会很慢,原因是加锁导致排队,并发实质上变成了串行,性能被锁卡住。
解决方法就是使用threadlocal,让线程在自己的局部变量资源上运行。
测试发现,最终统计数据依然不准确。
原因是spring默认线程池有20多个线程,这些线程每一个都有自己的局部变量c,执行10000请求后,需要收集各个线程的数据。
虽然threadlocal是各个线程独占的数据,但也是进程持有的,不过java没有提供收集数据的接口,所以可以通过hashmap或hashset来存储threadlocal,最后一并收集。
改进,因为set访问需要同步,所以addset中加入同步锁,而且set访问次数最多是线程池的线程数,相对c的访问次数要少,属于低频访问,所以对总体性能影响小。
散列更均匀,减少冲突
解决一致性问题,除了排队(加锁)、投票(拜占庭将军)、cas+voilate外,threadlocal不失为一个更轻量级的优选方案。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
浅析我对 String、StringBuilder、StringBuffer 的理解
使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)
Springboot整合freemarker 404问题解决方案
引入mybatis-plus报 Invalid bound statement错误问题的解决方法
网友评论