ThreadLocal

在开发过程中,ThreadLocal一般会建议采用private static修饰,这样做既有好处也有坏处。好处是它一定程度上可以避免错误,至少可以避免 重复创建TSO(Thead Specific Object,即ThreadLocal所关联的对象)所导致的浪费。坏处是这样做可能正好形成内存泄漏所需的条件(只要线程不被销毁,ThreadLocal就会一直存在)。

​ ThreadLocal创建后放入ThreadLocalMap中,ThreadLocal作为key是弱引用,当ThreadLocal用完后,map可能还保存着ThreadLocal的value,key都消失了,value就找不到了,这种value多了以后就可能出现内存泄漏。ThreadLocalMap还有一种机制,每次get、set、remove时就会检测map中key为空的entry,然后干掉这个entry。不过还是建议用户用完后自己remove

​ ThreadLocalMap如何解决冲突?采用线性探测的方式,就是不断找一下个entry,直到找到key为空的entry。

ThreadLocalMap和HashMap的区别

1.两者都是Key和Value的形式,但是ThreadLocalMap的Key是指定的(ThreadLocal),HashMap的是任意值。
2.都是使用了数组去存储数据。
3.set或者put的值的时候,使用的哈希算法不一样。ThreaLocalMap中没有采用传统的调用ThreadLocal的hashcode方法(继承自object的hashcode),而是调用nexthashcode。
4.解决哈希冲突的算法不一样。HashMap使用的是链地址法。ThreadLocalMap使用的是开放寻址法,就是简单的步长加1或减1及线性探测

posted @ 2021-04-22 10:55  i%2  阅读(77)  评论(0)    收藏  举报