参考方法如何在Java项目中使用

  介绍

这篇文章给大家介绍参考方法如何在Java项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强> Java 参考详解

在jdk 1.2及其以后,引入了强引,用软引,用弱引,用虚引用这四个概念。网上很多关于这四个概念的解释,但大多是概念性的泛泛而谈,今天我结合着代码分析了一下,首先我们先来看定义与大概解释(引用类型在包. lang。ref里)。

<强> 1,强引用(StrongReference)

强引用不会被GC回收,并且在. lang。ref里也没有实际的对应类型。举个例子来说:

refQueue=new ReferenceQueue ();
  PhantomReferencephanRef=new PhantomReference (obj, refQueue);//调用phanRef.get()不管在什么情况下会一直返回零
  对象objg=phanRef.get ();//如果obj被置为零,当GC发现了虚引,用GC会将phanRef插入进我们之前创建时传入的refQueue队列//注意,此时phanRef所引用的obj对象,并没有被GC回收,在我们显式地调用refQueue.poll返回phanRef之后//当GC第二次发现虚引用,而此时JVM将phanRef插入到refQueue会插入失败,此GC时才会对obj进行回收
  Reference<及# 63;Object>延伸;phanRefP=refQueue.poll ();  

看了简单的定义之后,我们结合着代码来测试一下,强引用就不用说了,软引用的描述也很清楚,关键是“弱引用”与“虚引用”。

<强>弱引用:

公共静态void main (String [] args)抛出InterruptedException {
  对象obj=新对象();
  ReferenceQueuerefQueue=new ReferenceQueue ();
  WeakReferenceweakRef=new WeakReference (obj, refQueue);
  System.out.println (weakRef.get ());
  System.out.println (refQueue.poll ());
  obj=零;
  system . gc ();
  System.out.println (weakRef.get ());
  System.out.println (refQueue.poll ());
  } 

由于system . GC()是告诉JVM中这是一个执行GC的好时机,但具体执不执行由JVM决定,因此当JVM决定执行GC,得到的结果便是(事实上这段代码一般都会执行GC):

 java.lang.Object@de6ced
  零
  零
  java.lang.ref.WeakReference@1fb8ee3 

从执行结果得知,通过调用weakRef.get()我们得到了obj对象,由于没有执行GC,因此refQueue.poll()返回的空,当我们把obj=零;此时没有引用指向堆中的obj对象了,这里JVM执行了一次GC,我们通过weakRef.get()发现返回了空,而refQueue.poll()返回了WeakReference对象,因此JVM在对obj进行了回收之后,才将weakRef插入到refQueue队列中。

<强>虚引用:

公共静态void main (String [] args)抛出InterruptedException {
  对象obj=新对象();
  ReferenceQueuerefQueue=new ReferenceQueue ();
  PhantomReferencephanRef=new PhantomReference (obj, refQueue);
  System.out.println (phanRef.get ());
  System.out.println (refQueue.poll ());
  obj=零;
  system . gc ();
  System.out.println (phanRef.get ());
  System.out.println (refQueue.poll ());
  } 

同样,当JVM执行了GC,得到的结果便是:

零
  零
  零
  java.lang.ref.PhantomReference@1fb8ee3 

从执行结果得知,我们先前说的没有错,phanRef.get()不管在什么情况下,都会返回零,而当JVM执行GC发现虚引用之后,JVM并没有回收obj,而是将PhantomReference对象插入到对应的虚引用队列refQueue中,当调用refQueue.poll()返回PhantomReference对象时,调查方法会先把PhantomReference的持有队列队列(ReferenceQueue<及# 63;超级T>)置为空,空对象继承自ReferenceQueue,将排队(参考paramReference)方法覆盖为返回false,而此时obj再次被GC发现时,JVM再将PhantomReference插入到零队列中便会插入失败返回假,此GC时便会回收obj。事实上通过这段代码我们也的却看不出来obj是否被回收,但通过PhantomReference的javadoc注释中有一句是这样写的:

参考方法如何在Java项目中使用

Copyright © 2020-2023 feiqueyun.cn. All Rights Reserved. 肥雀云_南京肥雀信息技术有限公司版权所有 南京肥雀信息技术有限公司 苏ICP备16063723号-5