当前位置: 首页 > 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 的执行顺序

相关文章:

  • Python+Appium实现自动化测试
  • 计算机网络——网络层(3)
  • 贝锐蒲公英全新网页认证,保障企业访客无线网络安全
  • 2024 高级前端面试题之 移动端多端开发 「精选篇」
  • transformer_正余弦位置编码代码笔记
  • 服务器为什么老是被攻击?被攻击了怎么办?
  • 十一、常用API——练习
  • 《HTML 简易速速上手小册》第8章:HTML 表单高级技术(2024 最新版)
  • 【云上建站】快速在云上构建个人网站3——网站选型和搭建
  • 用ASM HEMT模型提取GaN器件的参数
  • VUE!!!必看
  • ElementUI Form:Input 输入框
  • 消息中间件(MQ)对比:RabbitMQ、Kafka、ActiveMQ 和 RocketMQ
  • 本地socket通信
  • linux ping 某台服务的端口
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • ERLANG 网工修炼笔记 ---- UDP
  • express如何解决request entity too large问题
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript类型识别
  • Java超时控制的实现
  • java第三方包学习之lombok
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python_网络编程
  • Sass 快速入门教程
  • Solarized Scheme
  • SQLServer之创建显式事务
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 面试总结JavaScript篇
  • 前端性能优化——回流与重绘
  • 使用Swoole加速Laravel(正式环境中)
  • 数组大概知多少
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 正则与JS中的正则
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (33)STM32——485实验笔记
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (pojstep1.3.1)1017(构造法模拟)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (一)Dubbo快速入门、介绍、使用
  • (转)fock函数详解
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET MVC之AOP
  • .net 获取url的方法
  • .net对接阿里云CSB服务
  • .Net多线程总结