final、finally、finalize

final

  1. final 可以用来修饰类、方法、变量,修饰对象不同所代表的意义也不同
    • 修饰类则代表该类不可继承扩展
    • 修饰方法则代表该方法不可重写
    • 修饰变量则代表该变量某种程度不可更改。为什么说是某种程度呢,因为这需要根据变量的类型来区分
      • 如果修饰的变量是基本类型,则该变量赋值一次之后就无法修改,这是 final 就是不可变的标志
      • 如果修饰的变量是引用类型,那么该变量赋值一次之后,就无法修改该变量的引用,但是该引用对象的属性还是可以更改的,比较常见的就是变量引用了一个List, 虽说用了 final 修饰,但是依然可以对该List的元素进行各种操作
  2. 将变量或参数使用 final 修饰可以清楚的避免意外赋值导致的编码错误
  3. 因为 final 修饰变量产生了某种程度的不可变的特性,所以它可以保护只读数据,因此在并发编程中使用 final 修饰变量有利于减少额外的同步开销,也可以省去一些防御性拷贝必要,从而提升性能

    finally

    finally 是 java 保证重点代码一定要被执行的一种机制。我们可以使用try-finallytry-catch-finally来进行类型关闭 JDBC 链接、保证 unlock 锁等操作

finalize

finalize 是基础类java.lang.Object的一个方法, 它的作用是保证对象在被垃圾收集器收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK9 开始被标记为 deprecated。

如果调用了 finalize 方法,则会导致该对象称为“特殊公民”,JVM 需要对它进行额外的处理。这样反而导致了 finalize 成为了快速回收的阻碍者,它可能导致你的对象经过多个垃圾收集周期才能被回收。

在实践中因为 finalize 拖慢垃圾收集,导致大量对象堆积,也是一种典型的导致 OOM 的原因。

因为我们要确保回收资源就是因为资源都是有限的,垃圾收集的时间不可预测,可能会极大加剧资源占用。所以对于消耗非常高频的资源,千万不要指望 finalize 去承担资源释放的职责。

资源用完立刻显示释放,或者利用资源池尽量重用