鉴于普罗大众都喜欢看热闹,咱们先来看个热闹再开工吧!
场景一:
中午了, 张三、李四和王五一起去食堂大菜吃饭。食堂刚经营不久,还很简陋,负责打菜的只有一位老阿姨。
张三:我要一份鸡腿。
李四:我要一份小鸡炖蘑菇。
张三:我再要一份红烧肉。
王五:我要一份红烧排骨。
李四:我不要小鸡炖蘑菇了,换成红烧鲫鱼。
王五:我再要一份椒盐虾。
张三:我再要一份梅菜扣肉。
......
张三:我点的红烧肉,为啥给我打红烧鲫鱼?
李四:我的红烧鲫鱼呢?
王五:我有点红烧肉吗?
......
李四:我点了15元的菜,为啥扣我20?
王五:我点了20元的菜,只扣了我15元,赚了,窃喜!
张三:我已经刷了卡了,怎么还叫我刷卡?
......
老阿姨毕竟上了年纪,不那么利索,这几个小伙子咋咋呼呼,快言快语,老阿姨也被搅晕了,手忙脚乱,忙中出错,这仨小伙也是怨声载道。
场景二:
食堂领导看到这个场景,赶紧要求大家排队,一个一个来。后来,老阿姨轻松多了,也没有再犯错了。
但是,新的问题又来了,打菜的人当中,很多妹子很磨叽,点个菜犹犹豫豫想半天。
张三:太慢了,我快饿死了!
李四:再这么慢,下次去别家!
王五:我等得花儿都谢啦!
赵六:啥?我点了啥菜,花了多少钱,其它人怎么都知道?是阿姨多嘴了,还是其它人偷偷关注我很久了?太不安全了,一点隐私都没有,以后不来了。
......
场景三:
领导听到这些怨言,心里很不是滋味,大手一挥:扩大经营,以后为你们每一个人开一个流动窗口并请一位私人阿姨,只为你一个人服务!
从此,再也没有怨言,阿姨也没有再犯错了,皆大欢喜......
场景一就像多个线程同时去操作一个数据,最终的结果就是混乱。于是出现了同步锁synchronized,同一时刻只运行一个线程操作,就像场景二,大家先来后到排队,混乱的问题解决了。但是此时一个线程在操作的时候,其它线程只能闲等着,而且这些数据是共享的,每个线程希望拥有只能自己操作的私人数据,ThreadLocal就正好满足了这个需求。
所以,相比于synchronized,Threadlocal通过牺牲空间来换取时间和效率。
2、ThreadLocal简介
ThreadLocal官方的介绍为:
1 /** 2 * This class provides thread-local variables. These variables differ from 3 * their normal counterparts in that each thread that accesses one (via its 4 * {@code get} or {@code set} method) has its own, independently initialized 5 * copy of the variable. {@code ThreadLocal} instances are typically private 6 * static fields in classes that wish to associate state with a thread (e.g., 7 * a user ID or Transaction ID). 8 */