ThreadLocal引用分析

简介: ThreadLocal引用分析

一 ThreadLocal概念

ThreadLocal学名线程本地变量,顾名思义,那就是私有的线程变量

二 ThreadLocal源码分析

private void set(ThreadLocal key, Object value) {

    // We don't use a fast path as with get() because it is at
    // least as common to use set() to create new entries as
    // it is to replace existing ones, in which case, a fast
    // path would fail more often than not.

    Entry[] tab = table;
    int len = tab.length;
    int i = key.threadLocalHashCode & (len-1);
    

我们看到其实他的数据结构是散列表的数组,有没有想起老朋友HashMap,但是,嘿嘿,他们不一样。
接着我们看看组成他的数组,数组的类型是Entry,这个是什么东西呢,我们看看他的源码

   static class Entry extends WeakReference {
        /** The value associated with this ThreadLocal. */
        Object value;

        Entry(ThreadLocal k, Object v) {
            super(k);
            value = v;
        }
    }
    

## 三 引用类别

大家看到了继承WeakReference了吗?小伙伴们知道他是啥吗? 他就是java的几种引用之一,java的引用分为
强引用,软引用,弱引用以及虚引用

  • 强引用

      Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收
    

    只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了

  • 软引用

    SoftReference<byte[]> sr = new SoftReference<>(buff);
    

    软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等

  • 弱引用

    弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用

  • 虚引用

    PhantomReference是一种极弱的引用关系,定义完成后就无法通过该引用获取对象,为对象设定虚引用的唯一目的就是为了对象被回收时收到一个系统通知。

相关文章
|
8月前
|
存储 Java Spring
ThreadLocal用法
ThreadLocal用法
65 0
ThreadLocal优化,使用ThreadLocal可以提高代码的复用性,感觉比较丢人,ThreadLocal的作用主要是复用代码
ThreadLocal优化,使用ThreadLocal可以提高代码的复用性,感觉比较丢人,ThreadLocal的作用主要是复用代码
|
Java
ThreadLocal全面解析
ThreadLocal全面解析
129 0
|
8月前
|
存储 安全 Java
对象的相等和引用相等的区别
对象的相等和引用相等的区别
|
安全 Java
变量的线程安全分析
变量的线程安全分析
|
Java 编译器 Android开发
普通内部类持有外部类引用的原理
内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通过this访问外部类的成员。 1、编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象(this)的引用; 2、编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为内部类中添加的成员变量赋值; 3、在调用内部类的构造函数初始化内部类对象时,会默认传入外部类的引用。
|
存储 安全 Java
ThreadLocal解析
JDK1.2 就这样了 ThreadLocal 为解决多种难题提供了一个新的思路; ThreadLocal的目的是为了解决多线程访问资源时的共享问题。 这原来是搜索到的线程本地的故事都是这样写的。 ,谎言说下去就形成了真理。 但在JDK文档里面
127 0
ThreadLocal解析
|
存储 前端开发 Java
用ThreadLocal来优化下代码吧
用ThreadLocal来优化下代码吧
202 0
用ThreadLocal来优化下代码吧
|
安全 Java 数据库连接
ThreadLocal类教程
ThreadLocal类教程
156 0