本文主要是介绍关于ThreadLocal,ThreadLocalMap,和Thread的结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关于ThreadLocal,ThreadLocalMap,和Thread的结构
-
首先,ThreadLocalMap是ThreadLocal的静态内部类;
-
其次,每个Thread中都包含了一个类型为ThreadLocal.ThreadLocalMap的变量threadLocals,也就是说每个线程都有自己独有的ThreadLocalMap;
-
ThreadLocal.ThreadLocalMap内部又有一个静态内部类Entry,用来存放键值对,key为ThreadLocal,value为Object;
-
ThreadLocal.ThreadLocalMap内部维护一个Entry数组,变量名为table,用来存放Entry元素;
-
ThreadLocal的使用:
ThreadLocal<Integer> local = new ThreadLocal<Integer>(){public Integer initialValue{return 0;} } local.get(); new Thread(()->{local.get(); }).start(); //这里的initialValue是一个默认的初始化方法 //当local在ThreadLocalMap中不存在但调用了get()时 //则将默认初始化中的返回对象作为Vlaue与local一起放到ThreadLocalMap中 //这里如果存放的不是基本数据类型的数据的时候,务必要重写initialValue方法 //确认初始化返回的是一个值相同但地址不同的对象,以保证达到线程隔离的目的
-
简单理解就是:每个线程都绑定了唯一的ThreadLocal.ThreadLocalMap,用来映射不同的线程中相同的ThreadLocal对应的值,这个对象无法被程序拿到,只能通过ThreadLocal其中的方法来进行访问,而放在ThreadLocal中的数据,如果是基本数据类型的话,就可以很好地实现线程之间的隔离,而如果是对象的话,务必使得两个线程中的ThreadLocal绑定的是值相同而地址不同的对象,否则指向同一个对象,无法达到线程隔离的目的。
这篇关于关于ThreadLocal,ThreadLocalMap,和Thread的结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!