ThreadLocal的个人理解

    今天ImportNew看了一篇文章,提到了ThreadLocal,引起了我的好奇心。对ThreadLocal进行了些许了解,在此总结一下。

原理

    Thread类中有有一个成员变量ThreadLocal.ThreadLocalMap,是ThreadLocal的内部类。ThreadLocal对象通过当前Thread对象,向Thread对象中的ThreadLocalMap对象put值,key是ThreadLocal对象。源码很简单,Thread和ThreadLocal稍微看一下就理解了。因此,通过ThreadLocal Put值的时候,实际上是往每一个Thread对象中的ThreadLocalMap放了一遍。

    通过原理也可以看出通过ThreadLocal Put的值实际上是存在了Thread的ThreadLocalMap中,它是与Thread有相同生命周期的。


使用场景

    举例:两个线程,各自访问各自的实例(比如session),并且这两个两个线程在执行的过程中需要用到很多对象,这些对象的很多地方都用到了session。(用例不好,个人认为理解道理就可以了)


ThreadLocal的个人理解_第1张图片

总结

    1.每个线程都有自己的ThreadLocalMap,存放自己的对象,与其它线程无关

    2.将ThreadLocal作为Key,将不同的对象的引用放入到不同的线程的ThreadLocalMap中,降低了对象传递的麻烦。

误区纠正

    之前看到文章说是ThreadLocal是用来解多线程对象共享的问题的。其中有依据很经典的话“一个是锁机制进行时间换空间,一个是存储拷贝进行空间换时间”。这句话本身是没有问题的,但是作者认为ThreadLocal对对象进行了拷贝,其实并不是这样的,而是为每个线程创建了一个对象引用,如果创建的引用是不变的话,还是解决不了多线程对象共享的问题。

你可能感兴趣的:(ThreadLocal的个人理解)