[英]How to throw throw from finalizers(of resource objects)
终结器不是析构函数,终结器没有用。
从我听到的内容中,很多Java资源对象都以“以防万一”的形式放在finalize()上。
这似乎是一种过分放纵的态度,很可能导致错误。
您最不希望做的是终结处理,以记录错误(在终结处理时未处理的资源)并将其打印为标准输出,然后进行处理。
更具限制性的态度可能是抛出异常。 我不一定要实现这种限制性资源对象,但我想知道如何去做。
但是在Java中,终结器中引发的异常将被忽略(否则,该对象将被放回到列表中以再次终结)。 有没有办法实现这样的事情? 也许一种方法可以给创建对象的线程提供终结器的终结器(如果它仍然存在)(或者如果不存在则可以是父线程)?
也!!!!! 其他gc语言(尤其是C#,python等)如何处理资源终结处理(它们通常对资源类实现“以防万一的处置”吗?),从终结处理程序抛出,为其他线程提供实例。 (注意:我不太在意/使用糖来调用dispose方法或接受自动关闭资源的闭包的方法,我对终结器扮演什么角色以及终结器的错误传播很感兴趣)。
终结器在专用线程中被调用,因此引发异常或错误不会实现任何效果,因为您将无法在代码或线程之一中捕获异常。
如果要将异常传递给另一个线程,则可以采用多种方法来执行此操作。 但是,我不清楚在另一个线程中将要执行的操作,即在当前线程中将要执行的操作。 例如,当您可以让当前线程记录一条消息时,为什么要创建一个异常以传递给另一个线程以变成日志消息。
终结器本身有很多负担,也有缺点和缺点,从花费更长的时间创建对象到在终结器线程调用finalize方法之前不分配资源等等。
一个人使用它的唯一原因是要谨慎处理资源,例如说InputStream拥有导致close()的方法,现在可能永远也不会调用它。 另一种必须使用它的情况是使用本机的。 绝对没有其他情况可以这样做。
现在,您希望实现上述问题的问题是:存在一个带有finalize()方法的对象。 现在,当没有强烈引用该对象时,将其发送给垃圾回收。 现在,它从其条目表中检查该特定对象是否具有finalize()方法(该方法在最初创建该对象时便已注意到)。 现在,当终结器线程运行finalize()方法时,在该方法内部有一段代码,最终导致该方法具有强大的参考价值。
下次调用同一对象进行垃圾回收时,该对象不会第二次发送到终结器队列(默认情况下,没有对象可以多次进入终结器队列),因此第二次不调用finalize()方法。 这可能会导致巨大的问题。
因此,如果您要处理某些事情,请确保在finalize()方法之外进行操作,而不要在finalize()中进行操作,因为这样做只会导致问题,而不会导致其他问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.