zoukankan      html  css  js  c++  java
  • Java中finalize()方法的作用

    finalize方法是Object提供的的实例方法,使用规则如下:

    1. 当对象不再被任何对象引用时,GC会调用该对象的finalize()方法
    2. finalize()是Object的方法,子类可以覆盖这个方法来做一些系统资源的释放或者数据的清理
    3. 可以在finalize()让这个对象再次被引用,避免被GC回收;但是最常用的目的还是做cleanup
    4. Java不保证这个finalize()一定被执行;但是保证调用finalize的线程没有持有任何user-visible同步锁。
    5. 在finalize里面抛出的异常会被忽略,同时方法终止。
    6. 当finalize被调用之后,JVM会再一次检测这个对象是否能被存活的线程访问得到,如果不是,则清除该对象。也就是finalize只能被调用一次;也就是说,覆盖了finalize方法的对象需要经过两个GC周期才能被清除。

    例子:

    //FileInputStream.java
    protected void finalize() throws IOException {
            if (guard != null) {
                guard.warnIfOpen();
            }
    
            if ((fd != null) &&  (fd != FileDescriptor.in)) {
                close();
            }
        }
    

    在finalize里面做资源释放的操作。

    有一种观点是,如果使用finalize仅仅是为了观察对象被回收,这时候我们可以用虚引用(PhantomReference)来代替,虚引用无法通过get获得对象,而且创建虚引用必须要有关联队列,当对象被回收之后,虚引用会被放入关联队列中,所以我们可以通过观察关联队列来判断对象是否被回收。
    在看终结器引用时讲到这里,感觉有点不清楚,故特意查文章再巩固确认。
    原文链接:finalize()方法的作用

    艾欧尼亚,昂扬不灭,为了更美好的明天而战(#^.^#)
  • 相关阅读:
    记录爱忘记的STL知识点
    小狼
    CVTE总结
    STL底层实现
    小狼,你家BOSS喊你面试啦!!!(四)
    npm属性笔记
    iview中关于table组件内放入Input会失去焦点
    js实现数组内数据的上移和下移
    google搜索使用技巧
    bat中实现代码拷贝到指定目录后启动命令行并更改默认路径
  • 原文地址:https://www.cnblogs.com/lovelywcc/p/14063279.html
Copyright © 2011-2022 走看看