终结者不是破坏者,终结者也没用。
我听到很多Java资源对象在finalize()上处理“以防万一”
这似乎是一种过于宽容的态度,可能会导致错误。
您最不希望做的是最终确定记录错误(在最终确定时将未处置的资源)并将其打印到标准输出然后处理。
更严格的态度可能是提出异常。
我不一定会实现这样的限制性资源对象,但我想知道如何做到这一点。
但是在Java中,终结器中抛出的异常会被忽略(除了将对象放回到列表中以便再次完成)。有没有办法实现这样的东西?如果它仍然存在(或者可能是父线程,可能是一种给终结器创建对象的线程提供异常的方法吗?
另外!!!!!其他gc语言(尤其是C#,python等)如何处理资源最终化(它们通常是否为资源类实现“以防万一?”),从终结器中抛出,给其他线程提供exeptions。 (注意:我不太关心使用糖来调用dispose方法或接受自动关闭资源的闭包的方法,我对终结器播放的角色和终结器的错误传播感兴趣。)
答案 0 :(得分:1)
在专用线程中调用终结器,因此抛出异常或错误将无法实现任何效果,因为您无法在代码或其中一个线程中捕获异常。
如果要将异常传递给另一个线程,可以通过多种方式执行此操作。但是我不清楚你会在另一个线程中做什么,你会在当前线程中做什么。也就是说,当你可以让当前的线程记录一条消息时,为什么要创建一个异常来传递给另一个线程转成日志消息。
答案 1 :(得分:0)
终结器本身具有负载和负载以及大量缺点,从创建对象需要更长的时间到不处理资源,直到终结器线程调用finalize方法为止。
人们应该使用它的唯一原因是采取预防措施来处理资源,例如InputStream的方法导致close(),现在也可能永远不会调用它。另一种必须使用它的情况是使用原生的。 当人们应该这样做时,绝对没有其他情况。
现在你想要实现上述内容的问题就是:有一个带有finalize()方法的对象。现在,当没有对该对象的强引用时,它将被发送给垃圾收集。现在它从其条目表中检查该特定对象是否具有finalize()方法(在第一个位置创建对象时注意到该方法)。现在当终结器线程运行finalize()方法时,在这个方法中有一段代码,最终导致这个方法具有强大的引用。
下次当为垃圾收集调用相同的对象时,第二次不会将此对象发送到终结器队列(默认情况下,因为没有对象可以多次转到终结器队列),因此不会调用finalize()方法第二次。这可能会导致巨大的问题。
因此,如果您正在处理某些事情,请确保您在finalize()方法之外执行此操作,而不是在finalize()中执行此操作,因为它只会导致问题而不会产生任何其他问题