最近一段时间在看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形式
最后来看代码片段: