ThreadLocal模式

最近一段时间在看struts源码,开始逐渐深入了解了下ThreadLocal模式,其实这个ThreadLocal很早就在jdk中存在了,以前我也看过,大概知道他的用法,但是从未在项目中大规模的使用,最近在struts的源码的学习中了解到,strtus2将这种模式运用到了极致,甚至于是整个struts2框架数据底层的基础核心。

关于什么是ThreadLocal以及他是干什么用的,这里就不多说,网上资料一大把,这里我想我自己的一点体会。

线程同步和ThreadLocal的区别?

都是用来解决多线程当发生资源共享时的线程同步的问题,但是解决思路不一样,线程同步的想法是:既然这个问题的根源在于多线程访问时,一个线程操作过程中被别的线程打断,修改了数据,那我就不让多个线程同时访问,大家排好队,一个一个来,谁先拿到锁谁先上。threadlocal的想法是,他觉得问题的根源是资源太少,所以发生争夺,如果大家每人都有,还会发生资源共享吗?没有资源共享,就没有了线程同步问题了

        线程同步还是threadlocal?

这两个方案从两个不同的角度来解决问题,一个从资源本身出发(threadlocal),给每个线程都发一个共享资源的副本从而解决同步问题,另外一个通过锁的机制来保证同时只能有一个线程对这个资源操作,从而解决线程同步问题,但是使用的场景不同,谁也不能替代谁,threadlocal适用于资源允许副本多个的情形下,锁用在不允许多个副本存在的情况下,比如银行账户问题,这个必须用锁来解决。

 

通俗的描述一下ThreadLocal的原理

ThreadLocal现在是个共占的资源,但是它本身不存储任何东西,真正的东西存在线程本身上,他的作用只是个KEY的作用?啥个意思,不懂?是的,详细说一下

刚才说数据不存在threadlocal上,那存在哪?

存在绿色框所示的threadlocalmap上,threadlocalmap是java.lang.Thread类中一个变量,既然数据存在每个线程自身上,那还要个threadlocal干啥呢?上面说了他起到了一个key的作用,因为threadlocalmap顾名思义他是个Map,map总得有个key吧,在实际应用中,一个线程可能有多个threadlocal形式



最后来看代码片段:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值