亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

java9之前finalizer,java9使用cleaner代替了finalizer。相比f(wàn)inalizer,cleaner(它存在于一個(gè)獨(dú)立類Cleaner中,需要時(shí)候注入到對(duì)應(yīng)類中即可)不會(huì)污染API而且cleaner有類庫(kù)可以控制它的線程(它兩都在后臺(tái)線程中執(zhí)行)。

避免使用的原因:

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

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

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

移植性問(wèn)題

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

性能問(wèn)題

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

安全問(wèn)題

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

兩個(gè)用處:

安全網(wǎng)

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

這是FileOutputStream的源碼

回收本地對(duì)等體對(duì)象

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

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

相關(guān)文章

  • Java SpringBoot快速集成SpringBootAdmin管控臺(tái)監(jiān)控服務(wù)詳解

    Java SpringBoot快速集成SpringBootAdmin管控臺(tái)監(jiān)控服務(wù)詳解

    這篇文章主要介紹了如何基于springboot-admin管控臺(tái)監(jiān)控服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 基于java Servlet編碼/異常處理(詳解)

    基于java Servlet編碼/異常處理(詳解)

    下面小編就為大家?guī)?lái)一篇基于java Servlet編碼/異常處理(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java實(shí)戰(zhàn)之圖書(shū)管理系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之圖書(shū)管理系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了如何利用Java語(yǔ)言編寫一個(gè)圖書(shū)管理系統(tǒng),文中采用的技術(shù)有Springboot、SpringMVC、MyBatis、ThymeLeaf 等,需要的可以參考一下
    2022-03-03
  • SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例

    SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例

    這篇文章主要介紹了SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 淺談Maven Wrapper

    淺談Maven Wrapper

    這篇文章主要介紹了淺談Maven Wrapper,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • SpringBoot多controller添加URL前綴的實(shí)現(xiàn)方法

    SpringBoot多controller添加URL前綴的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot多controller添加URL前綴的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Spring security 如何開(kāi)放 Swagger 訪問(wèn)權(quán)限

    Spring security 如何開(kāi)放 Swagger 訪問(wèn)權(quán)限

    這篇文章主要介紹了Spring security 如何開(kāi)放 Swagger 訪問(wèn)權(quán)限操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例

    SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例

    這篇文章主要介紹了SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java實(shí)現(xiàn)Timer的定時(shí)調(diào)度函數(shù)schedule的四種用法

    Java實(shí)現(xiàn)Timer的定時(shí)調(diào)度函數(shù)schedule的四種用法

    本文主要介紹了Java實(shí)現(xiàn)Timer的定時(shí)調(diào)度函數(shù)schedule的四種用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • java微信企業(yè)號(hào)開(kāi)發(fā)之通訊錄

    java微信企業(yè)號(hào)開(kāi)發(fā)之通訊錄

    這篇文章主要為大家詳細(xì)介紹了java微信企業(yè)號(hào)開(kāi)發(fā)之通訊錄的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評(píng)論