ThreadLocal前奏:我理解的java四种引用类型

简介: ThreadLocal前奏:我理解的java四种引用类型

前言


为了理解ThreadLocal,掌握引用的概念是非常有必要的。


引用与对象


java中我们通过一个引用指向内存中对象。

//创建一个引用,引用可以独立存在,并不一定需要与一个对象关联
User user;
user =  new User();

user是引用, 通过‘=’指向了内存中的对象。


四种引用


JDK1.2后,根据对对象的引用强度不同,将引用分为4种类型。


强引用:

平时使用最多,最普遍的引用。

User user;
user =  new User();//强引用
  • user就是强引用
  • 堆中的User对象实例,就是“被应用”;

只要user 指向 User对象。User对象就不会被回收。

user = null;断开了引用,User对象不可达,会被回收。


软引用:

我们可以通过SoftReference来定义一个软引用

SoftReference<User> softRef=new SoftReference<User>(new User());//软引用
  • 如果一个对象只有软引用,内存足够时,GC时不回收他。如果内容空间不足时,就会回收被软引用指向的对象内存。
  • 只要没有别回收,还可以使用

解释下:对象只有软引用对象有两种引用的情况

User user  = new User();//强引用
SoftReference<User> softRef=new SoftReference<User>(user);//软引用

对象只有软引用情况

SoftReference<User> softRef=new SoftReference<User>(new User());//软引用

User user  = new User();//强引用
SoftReference<User> softRef=new SoftReference<User>(user);//软引用
user = null;//断开了强引用。 此时只有软引用。

软引用可与引用队列(ReferenceQueue)联合使用,在创建软引用时,关联ReferenceQueue。如果软引用引用的对象被回收时,Java虚拟机会把这个软引用加入到与之关联的引用队列中。

软引用可用作内存敏感的高速缓存。


弱引用:

可以通过WeakReference来定义一个弱引用

WeakReference<> weak = new WeakReference<>(new User());//定义一个软引用指向堆内User对象
  • 如果对象只有弱引用,GC时,不管内存是否足够。都会回收,弱引用指向的对象。

弱引用也可与引用队列(ReferenceQueue)联合使用,在创建弱引用时,关联ReferenceQueue。如果弱引用引用的对象被回收时,Java虚拟机会把这个弱引用加入到与之关联的引用队列中。

ThreadLocal 中使用到了弱引用。


虚引用:

虚引用是最弱的引用,弱到,不能用弱引用访问到对象。

可以通过PhantomReference来定义一个虚引用。

虚引用,主要用来跟踪对象被垃圾回收器回收的活动。

虚引用必须与引用队列(ReferenceQueue)一起使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。我们可以根据引用是否在队列中,来判断对象的回收活动。


为什么需要不同的引用类型

我们看出引用强度的不同,对象的生命周期不同,垃圾回收策略丰富,有利于更好的管理对象内存。


总结:


  • 引用与对象的生命周期相关。
  • 对象可以被多种类型的,多个引用指向,但只要有一个强引用。垃圾回收器不回收。

关键时理解: 一个对象,可以被多种类型引用同时指向,强度最高的决定他的生命周期

注意:这里的内存应该是指“堆内存”,并且区分引用类型基本类型

//String user ="user";//
String user = new String("user");
SoftReference<String> softRef=new SoftReference<String>(user);
WeakReference<String> weak = new WeakReference<String>(user);
user=null;
System.out.println(softRef.get());
System.gc();
System.out.println(weak.get());



相关文章
|
4月前
|
存储 Java 数据安全/隐私保护
探索Java中神奇的ThreadLocal:为什么它是多线程编程的重要工具?
探索Java中神奇的ThreadLocal:为什么它是多线程编程的重要工具?
|
7月前
|
存储 缓存 算法
JVM第三讲:深入理解java虚拟机之垃圾回收算法?CMS垃圾回收的基本流程?对象引用类型?
JVM第三讲:深入理解java虚拟机之垃圾回收算法?CMS垃圾回收的基本流程?对象引用类型?
121 0
|
1天前
|
存储 安全 Java
Java一分钟之Java数据类型概览:基本类型与引用类型
【5月更文挑战第7天】本文概述了Java中的基本和引用数据类型,强调了理解它们对高效编程的重要性。基本类型包括数值、布尔和字符类型,而引用类型涉及类、接口、数组等。注意基本类型的精度损失和溢出问题,以及引用类型的空指针异常和内存泄漏。通过明确类型范围、使用包装类、空值检查和及时释放资源来避免这些问题。代码示例展示了基本类型和引用类型的使用。理解这些核心概念有助于编写更健壮的Java代码。
10 1
|
9天前
|
存储 Java C语言
【Java探索之旅】基本类型与引用类型 数组的应用 二维数组
【Java探索之旅】基本类型与引用类型 数组的应用 二维数组
10 0
|
12天前
|
Java 程序员
【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
|
15天前
|
Java 数据库
详聊Java的四种引用类型
最近,在回顾关于JVM的相关知识,其中有一个比较简单,同时又容易被大家忽视的知识点,就是关于4种引用的定义与使用场景,其实仔细刨析源码的时候会发现,在Java中很多地方都有涉及到关于不同引用的问题,并且有些面试官也会在面试的时候问及到这一块的内容
15 1
|
22天前
|
存储 Java
Java的ThreadLocal使用
Java的ThreadLocal使用
18 1
|
2月前
|
安全 Java
java中线程经常被问到ThreadLocal你懂吗?
java中线程经常被问到ThreadLocal你懂吗?
9 0
|
2月前
|
存储 Java C语言
【Java】以数组为例简单理解引用类型变量
【Java】以数组为例简单理解引用类型变量
16 1
|
2月前
|
Java
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
135 0