ThreadLocal中的WeakReference】的更多相关文章

在一般的网站开发中,基于Java的Web 框架都使用了ThreadLocal来存储一些全局的参数,在拦截器\Filter中设置变量,让变量可以在任意地方被获取. 一早就了解到里面有用到WeakReference(弱引用),但对弱引用仅限于一种懵懂的概念,并且认为只要GC,弱引用的对象就被回收掉了,实际情况呢? Thread对象有一个变量名为 threadLocals 的 ThreadLocalMap对象,这个类和HashMap类似,里面定义了一个Entry数组,不过这个Entry对象弱引用了Th…
本篇文章主要讲解 ThreadLocal 的用法和内部的数据结构及实现.有时候我们写代码的时候,不太注重类之间的职责划分,经常造出一些上帝类,也就是什么功能都往这个类里放.虽然能实现功能但是并不优雅且不好维护.这篇文章就介绍 ThreadLocal 中如何设计优雅的数据结构以及类之间的职责划分,至于怎么跟农夫山泉广告语扯上关系,相信你读完便有了答案,文末也有解释. 用法 ThreadLocal 对象可以当做每个线程局部变量.也就是不同线程同时读写同一个 ThreadLocal 对象,其实操作的是…
juce中的WeakReference设计得比较巧妙,巧妙就是使用delete之后就可以通知道WeakReference,原理其实也很间单,其实就是在对象里添加了一个子对象masterReference,对象在析构的时候主动调用masterReference.clear();,这样来达到通知弱指针的这个对象已经销毁了,可以设置为空了的目的. 感觉juce最后调用个clear还是觉得有点生硬,外层最好还是再嵌套一层,析构的时候自动调用clear就可以了,对象申明也写成宏,这样的话就简洁多了. 使用…
首先再讨论题主的这个观点之前我们要明确一下ThreadLocal的用途是什么? ThreadLocal并不是用来解决共享对象的多线程访问问题. 看了许多有关ThreadLocal的博客,看完之后会给人一种错觉,ThreadLocal就是用于在多线程情况下防止共享对象的线程安全问题,使用ThreadLocal之后,ThreadLocal的对象就不会有线程安全问题,但是一定是这样么,看如下代码   public class test {   public static void main(Strin…
新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a"); WeakReference<String> b = new WeakReference<String>(a); WeakHashMap<String, Integer> weakMap = new WeakHashMap<String, Integer>…
我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(PhantomReference).其中强引用,就是我们平时使用的最多的最普通的引用,虚引用一般我们是没有机会使用到的.所以我们主要了解下 WeakReference 和 SoftReference(除了上面说的四种引用之外,其实还有一种引用——原子引用AtomicReference,用于并发编程环境).…
Java语言中为对象的引用分为了四个级别,分别为 强引用 .软引用.弱引用.虚引用. 本文只针对java中的弱引用进行一些分析,如有出入还请多指正. 在分析弱引用之前,先阐述一个概念:什么是对象可到达和对象不可到达状态. 其实很简单,我举个例子: 现在有如下两个类class A class B,在JVM上生成他们两个类的实例分别为 instance a  instance b 有如下表达式: A a = new A(); B b = new B(); 两个强引用对象就生成了,好吧,那么这个时候我…
WeakReference 弱引用 定义:弱引用,与强引用(我们常见的引用方式)相对:特点是:GC在回收时会忽略掉弱引用对象(忽略掉这种引用关系),即:就算弱引用指向了某个对象,但只要该对象没有被强引用指向,该对象也会被GC检查时回收掉. 强引用实例自然不会被GC回收! 如何引出弱引用?弱引用的实际用途是什么? 什么是内存泄漏?Java使用有向图机制,通过GC自动检查内存中的对象:如果GC发现一个或一组对象为不可达的状态,则将该对象从内存中回收.也就是说:一个对象不被任何引用所指向,则该对象会在…
新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a"); WeakReference<String> b = new WeakReference<String>(a); WeakHashMap<String, Integer> weakMap = new WeakHashMap<String, Integer>…
一.对ThreadLocal概述 JDK API 写道: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本.ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联. 二.结合源码理解 可以看到ThreadLocal类中的变量只有这3个int型: public cl…