ThreadLocal的学习

做用域

方法之上,线程以内java

做用

用户要跨方法访问变量,但若变量是全局变量的话虽然能访问了,但可能会产生并发问题,这时能够把要共享的值放入ThreadLocal中,线程内都能访问到,但全部线程访问却只能访问本身的,没法访问其余线程的,这就至关于线程私有的共享变量并发

原理

ThreadLocal至关于在内部作了线程识别,哪条线程放进该全局变量的数据,只有该线程才能访问。异步

实现

Thread类有个属性,持有ThreadLocal的静态内部类ThreadLocalMap的引用,放进来的值就存放在这里。ThreadLocal的经常使用操做get/set/remove中,都是先根据Thread.currentThread()获取当前线程这个对象,而后根据这个对象获取其属性中ThreadLocalMap的引用threadLocals,这个map以当前线程做为key,放进的值做为value来存取,所以当前线程只能获取当前线程放进去的值了,从而达到识别线程的效果。spa

  • 其至关于与线程绑定的变量,至关于线程私有的共享变量,因此最难把握的是"不知道哪里是源头"
  • 如果没有删除,则变量的生命周期与线程同长,如果线程归属于某个线程池,那么生命周期更是长久
  • 不该该用于异步程序,由于其与线程绑定,而回调时继续执行的多是另外一个线程

总结

这更可能是一种技巧,而不是技术,其并不是是什么语言新特性,不过是封装了这些手段和技巧,从而达到了对于不了解的人来讲像java语言的一种特性同样,甚至java的特性不过也是对更底层的一种封装而已。线程

相关文章
相关标签/搜索