final、finally和finalize区别

345 阅读1分钟
finally

finally是用于异常处理时执行的操作。如果一个异常被catch到,那么catch语句就会执行,然后跳转到finally语句中执行相应的操作。不管有没有发生异常,finally语句块都会执行,一般用于执行释放锁的操作,因为如果没有finally语句的话中途出现异常无法释放锁导致系统崩溃。

finally失效的场景:
  1. 在try语句之前就出现了异常
  2. 在try语句中执行了system.exit(0)的操作
  3. 在try语句中间被中断或者被终止(killed)
finalize

在了解finalize之前,首先我们应知道虚拟机宣告一个对象死亡之前,至少应该经历两次标记过程。首先对象会进行**可达性分析(1)**来判断与GC Roots之间是否有引用链,如果没有它将会被第一次标记,然后进行一次筛选,筛选的标准是看被标记的对象对象“有没有执行finalize方法的必要”,没有的话直接回收,有的话进入下一轮,这个对象会被放置在一个叫做F-Queue的队列中,并在稍后会由一个虚拟机建立的finalizr的线程来执行(2),并且在虚拟机不会保证执行完每个对象的finalize方法,因为如果某些对象的finalized方法执行时间非常长的话会导致系统崩溃,这是对象最后一次逃离死亡的机会,如果对象在finalized方法中与引用链上的任何一个对象产生关联,那么他便可以存活,否则被回收。