最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 為什么要避免使用finalizer和Cleaner

 更新時間:2021年03月29日 11:41:23   作者:MR_程序猿劉  
這篇文章主要介紹了Java 為什么要避免使用finalizer和Cleaner,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

java9之前finalizer,java9使用cleaner代替了finalizer。相比finalizer,cleaner(它存在于一個獨立類Cleaner中,需要時候注入到對應(yīng)類中即可)不會污染API而且cleaner有類庫可以控制它的線程(它兩都在后臺線程中執(zhí)行)。

避免使用的原因:

行為的不穩(wěn)定性

它兩都不能保證及時的執(zhí)行,從方法可達(dá)到(對象被置空了)開始到最終的執(zhí)行,時間是任意長的。所以千萬不要使用他們來更新重要的持久狀態(tài),如釋放流資源、分布式鎖等。

System.gc和System.runFinalization這兩個方法會增加finalizer和cleaner被執(zhí)行的機會,但是不保證一定會執(zhí)行。唯一能保證它兩會被執(zhí)行的兩個方法(System.runFinalizersOnExit和Runtime.runFinalizersOnExit)有致命的缺陷,已經(jīng)被廢除很久了。

移植性問題

不同的JVM堆垃圾回收的算法不同,如果程序依賴finalizer或者cleaner被執(zhí)行的時間點,那么程序的表現(xiàn)可能截然不同

性能問題

finalizer和cleaner有一個非常嚴(yán)重的性能損耗。

安全問題

  • finalizer中如果出現(xiàn)異常會導(dǎo)致線程終止,但是不會打印線程軌跡甚至警告都不會打印出來,而且使正在銷毀的對象處于破壞狀態(tài),另一個線程如果使用這個破壞狀態(tài)的對象會出現(xiàn)行為的不確定性。cleaner沒有這個問題。
  • finalizer攻擊:利于finalizer方法,構(gòu)建出惡意子類對象,非法調(diào)用父類方法。final類不會被構(gòu)建惡意子類,所以不會遭到finalizer攻擊。對于非final類,重寫一個空的finalizer方法并用final修飾來防止finalizer攻擊。
//構(gòu)建對象使用后不能再次被實例化
public class Demo{
  private boolean flag = true;
  //防止實例化
  public Demo() {
    if (flag){
      throw new RuntimeException("不準(zhǔn)許再次創(chuàng)建對象");
    }
  }
  public void say() {
    System.out.println("DemoUtils.say");
  }
}
//構(gòu)建非法子類
class Demo2 extends Demo{
  public Demo2(){}
  //構(gòu)建finalizer攻擊
  @Override
  protected void finalize() throws Throwable {
    //會調(diào)用父類方法
    this.say();
    System.exit(0);
  }
  public static void main(String[] args) throws InterruptedException {
    try {
      //創(chuàng)建子類對象必然會調(diào)用父類構(gòu)造,所以會發(fā)生異常
      //但是在gc中還是執(zhí)行了父類的方法
      Demo demo = new Demo2();
      demo.say();
    } catch (Exception e) {
      System.out.println(e);
    }
    System.gc();
    //給垃圾回收提供時間
    Thread.sleep(5000);
  }
}
//運行結(jié)果
java.lang.RuntimeException: 不準(zhǔn)許再次創(chuàng)建對象
DemoUtils.say

兩個用處:

安全網(wǎng)

當(dāng)資源的所有者忘記使用close方法的時候,finalizer和cleaner可以充當(dāng)安全網(wǎng),雖然不能保證及時的釋放資源,但是遲一點釋放總比永遠(yuǎn)不釋放要好。要使用這樣的安全網(wǎng)就要認(rèn)證的考慮清除是否值得付出這樣的代價。所以Java一些AutoCloseable實現(xiàn)中都添加了安全網(wǎng)。

這是FileOutputStream的源碼

回收本地對等體對象

本地對等體:java操作native方法其實是委托給一個本地對等體對象,使用完成后java對象會被GC回收,但是這個對等體對象不是java對象不會被會GC回收。如果這個對象性能可以接受,而且沒有需要及時釋放的資源那么就可以使用finalizer或者cleaner進(jìn)行回收了。但是如果這個對等體性能無法接受且擁有必須被及時終止的資源,那么就需要提供一個close方法了。

以上就是Java 為什么要避免使用finalizer和Cleaner的詳細(xì)內(nèi)容,更多關(guān)于Java 避免使用finalizer和Cleaner的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring Cloud Feign簡單使用詳解

    Spring Cloud Feign簡單使用詳解

    本篇文章主要介紹了Spring Cloud Feign簡單使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Spring-webflux訪問關(guān)系型數(shù)據(jù)庫實戰(zhàn)

    Spring-webflux訪問關(guān)系型數(shù)據(jù)庫實戰(zhàn)

    這篇文章主要為大家介紹了Spring-webflux訪問關(guān)系型數(shù)據(jù)庫實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 在JAR文件中找不到主清單屬性的原因與解決方案

    在JAR文件中找不到主清單屬性的原因與解決方案

    在Java中,一個JAR文件通常包含一個名為MANIFEST.MF的清單文件,這個文件定義了關(guān)于JAR文件的各種元數(shù)據(jù),然而,有時我們可能會遇到一個問題,那就是在JAR文件中找不到主清單屬性,本文給大家介紹了JAR文件中找不到主清單屬性的原因和解決方案,需要的朋友可以參考下
    2024-04-04
  • mybatis中resulthandler的用法

    mybatis中resulthandler的用法

    這篇文章主要介紹了mybatis中resulthandler的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 使用Spring Boot實現(xiàn)操作數(shù)據(jù)庫的接口的過程

    使用Spring Boot實現(xiàn)操作數(shù)據(jù)庫的接口的過程

    本文給大家分享使用Spring Boot實現(xiàn)操作數(shù)據(jù)庫的接口的過程,包括springboot原理解析及實例代碼詳解,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Jmeter分布式壓力測試實現(xiàn)過程詳解

    Jmeter分布式壓力測試實現(xiàn)過程詳解

    這篇文章主要介紹了Jmeter分布式壓力測試實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 云IDE:Eclipse Che:Eclipse下一代IDE(推薦)

    云IDE:Eclipse Che:Eclipse下一代IDE(推薦)

    這篇文章主要介紹了云IDE:Eclipse Che:Eclipse下一代IDE,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java設(shè)計模式中的抽象工廠模式解讀

    Java設(shè)計模式中的抽象工廠模式解讀

    這篇文章主要介紹了Java設(shè)計模式中的抽象工廠模式解讀,抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口,而且無需指定他們的具體類,需要的朋友可以參考下
    2023-11-11
  • Java日常練習(xí)題,每天進(jìn)步一點點(16)

    Java日常練習(xí)題,每天進(jìn)步一點點(16)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Java中List轉(zhuǎn)Map的幾種常見方式與對比

    Java中List轉(zhuǎn)Map的幾種常見方式與對比

    JavaList轉(zhuǎn)Map是一個非常常用的技術(shù),對于Java開發(fā)人員來講,掌握該技術(shù)可以幫助我們更加高效地操作List集合中的對象,這篇文章主要給大家介紹了關(guān)于Java中List轉(zhuǎn)Map的幾種常見方式與對比的相關(guān)資料,需要的朋友可以參考下
    2024-02-02

最新評論

芦溪县| 腾冲县| 拜泉县| 泸溪县| 闸北区| 神池县| 鄄城县| 肃北| 色达县| 静安区| 井研县| 科技| 资溪县| 康定县| 元江| 漳浦县| 同仁县| 岚皋县| 彭山县| 罗平县| 南投市| 松桃| 久治县| 旬邑县| 临洮县| 中方县| 石门县| 龙口市| 武乡县| 永善县| 封开县| 承德市| 礼泉县| 宿松县| 石嘴山市| 体育| 淮北市| 湘西| 德清县| 教育| 响水县|