一、Thread类中有一个成员变量属于ThreadLocalMap类(一个定义在ThreadLocal类中的内部类),它是一个Map,他的key是ThreadLocal实例对象。 二、当为ThreadLocal类的对象set值时,首先得到当前线程的ThreadLocalMap类属性,而后以ThreadLocal类的对象为key,设定value。get值时则相似。 三、ThreadLocal变量的活动范围为某线程,是该线程“专有的,独自霸占”的,对该变量的全部操做均由该线程完成!也就是说,ThreadLocal 不是用来解决共享对象的多线程访问的竞争问题的,由于ThreadLocal.set() 到线程中的对象是该线程本身使用的对象,其余线程是不须要访问的,也访问不到的。当线程终止后,这些值会做为垃圾回收。 四、由ThreadLocal的工做原理决定了:每一个线程独自拥有一个变量,并不是是共享的。缓存
介绍一下Java四种引用包括强引用,软引用,弱引用,虚引用。多线程
强引用:编码
只要引用存在,垃圾回收器永远不会回收 Object obj = new Object(); //可直接经过obj取得对应的对象 如obj.equels(new Object()); 而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放以后,对象才会被释放掉,这也是咱们常常所用到的编码形式。线程
软引用:对象
非必须引用,内存溢出以前进行回收,能够经过如下代码实现 Object obj = new Object(); SoftReference<Object> sf = new SoftReference<Object>(obj); obj = null; sf.get();//有时候会返回null 这时候sf是对obj的一个软引用,经过sf.get()方法能够取到这个对象,固然,当这个对象被标记为须要回收的对象时,则返回null; 软引用主要用户实现相似缓存的功能,在内存足够的状况下直接经过软引用取值,无需从繁忙的真实来源查询数据,提高速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。内存
弱引用:get
第二次垃圾回收时回收,能够经过以下代码实现 Object obj = new Object(); WeakReference<Object> wf = new WeakReference<Object>(obj); obj = null; wf.get();//有时候会返回null wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾 弱引用是在第二次垃圾回收时回收,短期内经过弱引用取对应的数据,能够取到,当执行过第二次垃圾回收时,将返回null。 弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,能够经过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。监控
虚引用:变量
垃圾回收时回收,没法经过引用取到对象值,能够经过以下代码实现 Object obj = new Object(); PhantomReference<Object> pf = new PhantomReference<Object>(obj); obj=null; pf.get();//永远返回null pf.isEnQueued();//返回是否从内存中已经删除 虚引用是每次垃圾回收的时候都会被回收,经过虚引用的get方法永远获取到的数据为null,所以也被成为幽灵引用。 虚引用主要用于检测对象是否已经从内存中删除。原理