天热无聊,打开项目学习下项目里的代码,看到有大牛用到了ThreadLocal 这个类了,好奇心顿时不由而来,经各方打探和学习总结了下,其实也不是总结,就是把人家告诉我的写到这,然后告诉大家,如有雷同,纯属巧合,如有错误,还请指点。
首先大牛举了个厕所蹲坑的例子:
假如在厕所的每个蹲坑隔间里没有卫生纸,每个人只能在隔间外面一个公共的地方抽纸,这个擦屁股的手纸是公用的,且某个时刻只能有一个人去抽纸。这样在生活中,如果人多,就会排队,效率地下(暂且不说万一没有纸会怎么样) 内急的岂不是屎涨裤裆里了。所以每个蹲坑间放一卷手纸。这样,原来公用的手纸都被各个蹲坑间私有化了,外界不能干涉,即便别人蹲坑的时候用没了纸,也不会打扰到你蹲坑的心情。
好下面我们在稍加专业点来解释
如果公共变量多个线程去访问 不加锁会导致变量值混乱,无法控制。
加锁又会导致并发性能。加锁的意思就好比厕所里需要拿手纸的都给我一个个排队拿。所以多放几份了。各自用各自的 互不影响。
专业点说:
当你的公共变量 A线程对该变量的修改不会影响到B线程,同理B线程也不会影响到A线程,即各个线程对共享变量的修改是独立的,多个线程之间不需要实时共享变量数据时,才可以使用ThreadLocal。
再就是有些多线程用不到Threadlocal,比如减库存操作可能会有多个线程去减。但是A线程的修改 B线程必须要能够读到。此时就不能用ThreadLocal了。
不知道大家ThreadLocal 明白了没,如果有的地方写错了,还请指点出来。
最后感谢益达 大牛的热心解读,他的更多博客请参考http://iamyida.iteye.com/