ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

避免Finalizer和Cleaner-第二章创建和销毁对象-Effective Java学习笔记07

2021-01-25 09:59:55  阅读:168  来源: 互联网

标签:Cleaner Java room Room public out numJunkPiles 07


学习笔记@Effective Java

文章内容来源于Joshua Bloch - Effective Java (3rd) - 2018.chm一书

第二章

创建和注销对象

Item 8避免Finalizer和Cleaner

// An autocloseable class using a cleaner as a safety net
public class Room implements AutoCloseable {
    private static final Cleaner cleaner = Cleaner.create();

    // Resource that requires cleaning. Must not refer to Room!
    private static class State implements Runnable {
        int numJunkPiles; // Number of junk piles in this room

        State(int numJunkPiles) {
            this.numJunkPiles = numJunkPiles;
        }

        // Invoked by close method or cleaner
        @Override public void run() {
            System.out.println("Cleaning room");
            numJunkPiles = 0;
        }
    }

    // The state of this room, shared with our cleanable
    private final State state;

    // Our cleanable. Cleans the room when it’s eligible for gc
    private final Cleaner.Cleanable cleanable;

    public Room(int numJunkPiles) {
        state = new State(numJunkPiles);
        cleanable = cleaner.register(this, state);
    }

    @Override public void close() {
        cleanable.clean();
    }
} 

正如我们前面所说的,房间的Cleaner只是用作安全网。如果客户机在try-with-resource块中包围了所有文件室实例,那么就不需要自动清理。这个行为良好的客户演示了以下行为:

public class Adult {
    public static void main(String[] args) {
        try (Room myRoom = new Room(7)) {
            System.out.println("Goodbye");
        }
    }
} 

正如你所料,运行Adult程序打印Goodbye,然后是打扫房间。但是这个行为不端的程序怎么办,它从不打扫房间?

public class Teenager {
    public static void main(String[] args) {
        new Room(99);
        System.out.println("Peace out");
    }
} 

你可能期望它打印出Peace out,然后是Cleaning room,但在我的机器上,它从不打印Cleaning room;它只是退出。这就是我们前面提到的不可预测性。规范说,“清洁器在清洁过程中的行为系统出口是特定于实现的。对于是否调用清理操作没有任何保证。”虽然规范没有说明,但对于正常的程序退出也是如此。在我的机器上,添加行垃圾回收()到青少年的主要方法足以使其在退出之前打印到Cleaning room,但不能保证您会在您的机器上看到相同的行为。

总之,不要使用Cleaner,或者在Java9之前的版本中使用终结器,除非作为安全网或终止非关键的本机资源。即便如此,也要注意不确定性和性能后果。

标签:Cleaner,Java,room,Room,public,out,numJunkPiles,07
来源: https://blog.csdn.net/weixin_43596589/article/details/113102918

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有