java四種引用與回調函數


JAVA四種引用

java對象的引用包括:

  1. 強引用
  2. 軟引用
  3. 弱引用
  4. 虛引用

Java中提供這四種引用類型主要有兩個目的:

  第一是可以讓程序員通過代碼的方式決定某些對象的生命周期;

  第二是有利於JVM進行垃圾回收。

實際用例

1.強引用

  是指創建一個對象並把這個對象賦給一個引用變量。

  比如

  Object object =new Object();

  String str ="哈哈哈";

  強引用有引用變量指向時永遠不會被垃圾回收,JVM寧願拋出OutOfMemory錯誤也不會回收這種對象。

2.軟引用

  軟引用的特點是,如果JVM內存空間充沛,垃圾回收器就不會回收軟引用變量。

  在回收器對這個Java對象回收前,SoftReference類所提供的get()方法返回Java對象的強引用。另外,一旦垃圾線程回收該Java對象之 后,get()方法將返回null。

  舉個栗子:

  BinarySearch bs = new BinarySearch();//二分查找

  bs.find(test, 0, test.length - 1, 5);

  SoftReference<BinarySearch> ruanYinYong = new SoftReference<BinarySearch>(bs);

  bs = null;

  ruanYinYong.get().find(test, 0, test.length - 1, 5);//即便強引用已經為Null,但是軟引用還可以繼續用。

  如果存在強引用同時與之關聯,則進行垃圾回收時也不會回收該對象。(弱引用也是如此)

3.弱引用

  WeakReference<People>reference=new WeakReference<People>(new People("zhouqian",20));

  System.out.println(reference.get());

  System.gc();//通知垃圾回收器回收資源

  System.out.println(reference.get());

  第一個輸出,第二個輸出為null

4.虛引用

  java中使用PhantomReference來表示虛引用。就像某個對象沒有引用與之關聯一樣,若某個對象與虛引用關聯,那么在任何時候都可能被JVM回收掉。虛引用不能單獨使用,必須配合引用隊列一起使用。

  當垃圾回收器發現對象與虛引用關聯,就會在回收它之前,將這個虛引用加入到引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被回收,從而進行操作。

  ReferenceQueue<String> queue = new ReferenceQueue<>();

  PhantomReference<String> str = new PhantomReference<String>("chx", queue);

  System.out.println(str.get());

5.軟引用結合回調函數使用

import java.lang.ref.SoftReference;

public class CallBackMain {

SoftReference<CallBackTest> ruanYinYong = new SoftReference<CallBackTest>(new CallBackTest());

public static void main(String[] args) {

  new CallBackMain().startCallBack();

}

public void startCallBack() {

System.out.println("我去做別的了");

ruanYinYong.get().callBack();

}

}

class CallBackTest {

public static int b = 1;

public void callBack() {

  System.out.println("我是回調函數" + b);

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM