当前位置: 首页 > news >正文

第3讲 谈谈final、finally、 finalize有什么不同?

参考

三者区别

final

  • final 是 java 关键字
  • 可修饰变量(类成员变量、类静态变量、局部变量和形参):表示不可修改当前变量的值(这里的值可以是地址,也可以是基本类型的值)#(注意:final只是限定当前变量的值,并不会限制引用对象的增删改查)#
  • 可修饰方法:表示方法不可以被重写(Override),可以修饰private、static修饰的方法
  • 可修饰类:表示当前类不可以被继承(较多的基本类型的引用类型都是final修饰的)
  • final 还可以提升性能:从并发角度分析#后续分析#

finally

  • java 关键字,是一种能够保证代码一定被执行的机制,当然也有两种情况不会执行:
    • try 未被执行
    • 在finally之前执行了 System.exit(0) 语句,强制退出

finalize

  • java 关键字
  • 是Object类中定义的方法
  • 主要用于垃圾回收

为啥 finalize不推荐使用

  • 垃圾回收主要根据可达性分析,判断一个对象是否可以被回收,当一个对象被判定为从GC ROOT不可达,也并非一定被回收。因此对象被回收需要经历两次标记过程,才会判断一个对象是否需要真正被回收

    总结:如果对象未实现 finalize 方法,在经历第二次标记后,会被判定为直接回收,另外,finalize方法并不保证一个对象一定被回收

两次标记:

  • 第一次标记:该对象从GC ROOT不可达(或者说不存在GC ROOT引用链)

  • 第二次标记:就会判断该对象是否实现或者被调用 finalize 方法

    • 如果确定该队形一定要执行 finalize 方法,首先将该对象添加进F-队列中
    • 然后收集器会对F-队列中的对象再次进行标记,如果该对象在执行finalize方法的时候,被其他GCRoot可达的对象引用,该对象就不会被回收

调用finalize方法,对象一定被回收吗?

  • 被添加到F队列的对象,稍后虚拟机自动建立低优先级的回收线程执行finalize方法(这里的执行只是表示开始执行**#finalize#**,由于极端对象由于死循环、执行慢的情况,会导致队列中的其他对象一直处于等待场景,因此,并不保证 finalize 执行完成)
  • 如果对象在 finalize 方法中被其他GCRoot可达的对象引用,该对象就不会被回收

了解Cleaner机制(后续补充)

finally 和 Return 的执行顺序

http://www.lryc.cn/news/289642.html

相关文章:

  • MC3172 串口模块
  • VUE3 加载自定义SVG文件
  • 【数据分析】numpy基础第五天
  • CSS 双色拼接按钮效果
  • T05垃圾收集算法与垃圾收集器ParNew CMS
  • 每日一道面试题:Java中序列化与反序列化
  • 论文阅读:Vary-toy论文阅读笔记
  • 【Linux】开始使用 vim 吧!!!
  • 多线程面试合集
  • 从微服务到云原生
  • bxCAN 主要特性
  • 武忠祥2025高等数学,基础阶段的百度网盘+视频及PDF
  • 用JavaFX写了一个简易的管理系统
  • 第二百九十回
  • bert实现完形填空简单案例
  • Jmeter 分布式测试
  • 在 Ubuntu 上安装 Docker Engine
  • Mac安装nvm,安装多个不同版本node,指定node版本
  • 【开源】基于JAVA+Vue+SpringBoot的智慧家政系统
  • Python NLP深度学习进阶:自然语言处理
  • STM32单片机基本原理与应用(三)
  • Android studio布局详解
  • 第四篇:怎么写express的路由(接口+请求)
  • 算法学习记录:有关树的基础
  • 2. 《大数据之路:阿里巴巴大数据实践》学习笔记,持续更新ing
  • 编程笔记 html5cssjs 062 JavaScrip如何使用
  • 【前端基础--7】
  • 微信小程序如何搜索iBeacon设备
  • JVM篇:垃圾回收算法
  • 2024年数学建模美赛 分析与编程