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去承担资源释放的职责。

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


原创文章,转载请出处注明。

下面是我的个人公众号,欢迎关注交流

# Java
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×