Jtoss Jtoss
首页
  • 数据结构与算法

    • 数据结构与算法 - 概述
    • 数据结构与算法 - 复杂度分析
    • 数据结构 - 线性表
    • 算法 - 常见排序算法
  • 代码规范

    • 代码简洁之道
    • 阿里巴巴开发手册
    • 谷歌Java编程风格指南
  • 设计模式

    • 编写高质量代码概述
    • 面向对象
    • 设计原则
    • 设计模式-创建型
    • 设计模式-结构型
    • 设计模式-行为型(上)
    • 设计模式-行为型(下)
    • 浅析框架源码中的设计模式
    • 业务框架实战案例
  • MySQL 基础

    • MySQL - 数据库设计规范
    • MySQL - 必知必会
  • MySQL 进阶

    • MySQL - 基础架构
    • MySQL - InnoDB存储引擎
    • MySQL - InnoDB缓冲池
    • MySQL - 事务与锁
    • MySQL - 索引
    • MySQL - 查询执行计划
    • MySQL - 性能优化
  • Redis 系列

    • Redis入门 - 基础相关
    • Redis进阶 - 数据结构
    • Redis进阶 - 持久化RDB和AOF
    • Redis进阶 - 事件机制
    • Redis进阶 - 事务
    • Redis进阶 - 高可用高可扩展
    • Redis进阶 - 缓存问题
    • Redis进阶 - 性能调优
  • Java 基础

    • Java 基础 - 知识点
    • Java 基础 - 面向对象
    • Java 基础 - Q/A
  • Java 进阶 - 集合框架

    • Java 集合框架详解
  • Java 进阶 - 多线程与并发

    • Java 并发 - 理论基础
    • Java 并发 - 线程基础
    • Java 并发 - 各种锁
    • Java 并发 - 关键字 volatile
    • Java 并发 - 关键字 synchronized
    • JUC - CAS与原子操作
    • JUC - 锁核心类AQS
    • JUC - 锁接口和类简介
    • JUC - 并发容器简介
    • JUC - 通信工具类
    • JUC - Fork-Join框架
    • JUC - 线程池
  • Java 进阶 - JVM

    • JVM - 概述
    • JVM - 类加载机制
    • JVM - 内存结构
    • JVM - 垃圾回收机制
    • JVM - 性能调优
  • Maven系列

    • Maven基础知识
    • Maven项目构建
    • Maven多模块配置
  • Spring 框架

    • Spring 框架 - 框架介绍
    • Spring 框架 - IOC详解
    • Spring 框架 - AOP详解
    • Spring 框架 - SpringMVC详解
  • Spring Boot 系列

    • Spring Boot - 开发入门
    • Spring Boot - 接口相关
  • Spring Cloud 系列
  • Mybatis 系列

    • Mybatis - 总体框架设计
    • Mybatis - 初始化基本过程
    • Mybatis - sqlSession执行过程
    • Mybatis - 插件机制
    • Mybatis - 事务管理机制
    • Mybatis - 缓存机制
  • 业务常见问题

    • Java 业务开发常见错误(一)
    • Java 业务开发常见错误(二)
    • Java 业务开发常见错误(三)
    • Java 业务开发常见错误(四)
    • Java 业务开发常见错误(五)
    • Java 业务开发常见错误(六)
  • IDEA系列

    • IDEA 2021开发环境配置
    • IDEA 快捷键
  • Git系列

    • git status中文乱码
  • 其他

    • Typora+Picgo 自动上传图片
    • hsdis 和 jitwatch
  • 实用技巧
  • 收藏
  • 摄影
  • 学习
  • 标签
  • 归档

Jason Huang

后端程序猿
首页
  • 数据结构与算法

    • 数据结构与算法 - 概述
    • 数据结构与算法 - 复杂度分析
    • 数据结构 - 线性表
    • 算法 - 常见排序算法
  • 代码规范

    • 代码简洁之道
    • 阿里巴巴开发手册
    • 谷歌Java编程风格指南
  • 设计模式

    • 编写高质量代码概述
    • 面向对象
    • 设计原则
    • 设计模式-创建型
    • 设计模式-结构型
    • 设计模式-行为型(上)
    • 设计模式-行为型(下)
    • 浅析框架源码中的设计模式
    • 业务框架实战案例
  • MySQL 基础

    • MySQL - 数据库设计规范
    • MySQL - 必知必会
  • MySQL 进阶

    • MySQL - 基础架构
    • MySQL - InnoDB存储引擎
    • MySQL - InnoDB缓冲池
    • MySQL - 事务与锁
    • MySQL - 索引
    • MySQL - 查询执行计划
    • MySQL - 性能优化
  • Redis 系列

    • Redis入门 - 基础相关
    • Redis进阶 - 数据结构
    • Redis进阶 - 持久化RDB和AOF
    • Redis进阶 - 事件机制
    • Redis进阶 - 事务
    • Redis进阶 - 高可用高可扩展
    • Redis进阶 - 缓存问题
    • Redis进阶 - 性能调优
  • Java 基础

    • Java 基础 - 知识点
    • Java 基础 - 面向对象
    • Java 基础 - Q/A
  • Java 进阶 - 集合框架

    • Java 集合框架详解
  • Java 进阶 - 多线程与并发

    • Java 并发 - 理论基础
    • Java 并发 - 线程基础
    • Java 并发 - 各种锁
    • Java 并发 - 关键字 volatile
    • Java 并发 - 关键字 synchronized
    • JUC - CAS与原子操作
    • JUC - 锁核心类AQS
    • JUC - 锁接口和类简介
    • JUC - 并发容器简介
    • JUC - 通信工具类
    • JUC - Fork-Join框架
    • JUC - 线程池
  • Java 进阶 - JVM

    • JVM - 概述
    • JVM - 类加载机制
    • JVM - 内存结构
    • JVM - 垃圾回收机制
    • JVM - 性能调优
  • Maven系列

    • Maven基础知识
    • Maven项目构建
    • Maven多模块配置
  • Spring 框架

    • Spring 框架 - 框架介绍
    • Spring 框架 - IOC详解
    • Spring 框架 - AOP详解
    • Spring 框架 - SpringMVC详解
  • Spring Boot 系列

    • Spring Boot - 开发入门
    • Spring Boot - 接口相关
  • Spring Cloud 系列
  • Mybatis 系列

    • Mybatis - 总体框架设计
    • Mybatis - 初始化基本过程
    • Mybatis - sqlSession执行过程
    • Mybatis - 插件机制
    • Mybatis - 事务管理机制
    • Mybatis - 缓存机制
  • 业务常见问题

    • Java 业务开发常见错误(一)
    • Java 业务开发常见错误(二)
    • Java 业务开发常见错误(三)
    • Java 业务开发常见错误(四)
    • Java 业务开发常见错误(五)
    • Java 业务开发常见错误(六)
  • IDEA系列

    • IDEA 2021开发环境配置
    • IDEA 快捷键
  • Git系列

    • git status中文乱码
  • 其他

    • Typora+Picgo 自动上传图片
    • hsdis 和 jitwatch
  • 实用技巧
  • 收藏
  • 摄影
  • 学习
  • 标签
  • 归档
  • Java 基础

    • Java 基础 - 谈谈 Java 平台
    • Java 基础 - 知识点
    • Java 基础 - 面向对象
    • Java 基础 - Q/A
    • 扩展 - int 和 Integer
    • 扩展 - final、finally、finalize
      • final
      • finally
      • finalize
    • 扩展 - String、StringBuilder、StringBuffer
    • 扩展 - Exception 和 Error
    • 扩展 - 引用
    • 扩展 - 数值计算问题
    • 扩展 - 反射和动态代理
  • Java 进阶 - 集合框架

  • Java 进阶 - 多线程与并发

  • Java 进阶 - JVM

  • Java 进阶 - 版本特性

  • Java
  • Java 基础
Jason
目录

扩展 - final、finally、finalize

# final、finally、finalize

# final

final 可以用来修饰 Java 的类、方法、变量,final 修饰的类不能被继承扩展;final 修饰方法不能被重写;final 修饰的变量是不可修改的。

推荐使用 final 关键字用来表明代码语义和逻辑意图。

使用 final 修饰的类和方法可以明确得表达当前的类和方法是不能被修改的,java.lang 包中的很多类都被声明为 final 如 String 类,防止 API 使用者更改基础功能;使用 final 修饰的变量或参数,可以有效避免意外赋值导致的程序错误。

final 可能对性能有好处,但在大部分场景下没有考虑的必要。

final 在某种程度上产生了不可变(immutable)效果,可以用于保护只读数据。特别在并发编程中,可以减少额外的同步开销,也可以省去一些防御性拷贝的必要。

final 并不等同于 immutable,比如一个集合对象使用 final 修饰,只是表示该对象引用不可修改,但还可以进行 add 等操作。可以使用 List.of() 来创建不可变的集合(因为该 List 是不可变的)

final List<String> list = new ArrayList();
list.add("test"); // 不会报错,list 可以执行添加操作
List<String> unmodifiableList = List.of("test");
unmodifiableList.add("etst"); // 会报错,因 List.of 创建的是不可变的集合
1
2
3
4

immutable 在某些场景是很好的实践,Java 类若要实现 immutable 则需要满足如下要求:

  • 使用 final 修饰类,防止被扩展而绕过限制
  • 类成员变量都声明为 private 和 final,并且不实现 setter 方法
  • 通常构造对象时,成员变量使用深度拷贝来初始化,而不是直接赋值,这是一种防御性措施,因为无法保证输入参数不被修改
  • 如果确定需要 getter 方法,或者需要返回内部状态的方法,则遵守 Copy-On-Write 原则,创建私有的 copy

延伸扩展:Java 中 Copy-On-Write 原则通常用于解决读多写少是的并发问题。比如 ArrayList 是不保证线程安全的,在并发场景下如果要保证线程安全,则需要给 ArrayList 添加读写所,读要读锁,写要写锁,读与读不互斥,读与写是互斥的,写与写也是互斥的。而在读多写少的场景,频繁的加锁有点浪费资源。固有了 CopyOnWriteArrayList ,其设计思想:

  • 底层的数组 array 变量使用 volatile 修饰,volatile 修饰的变量是内存可见的,可以保证任意线程在任意时间读取到最新变量值
  • 读操作不加锁
  • 写操作添加互斥锁,并先拷贝数组 array 的副本,在对副本进行写操作,最后将副本对象的引用赋值给数组 array,由于添加了互斥锁,固该过程是原子性的。

# finally

finally 是 Java 为保证某段代码一定会被执行的机制。使用 try-finally、try-catch-finally 进行关闭 JDBC 连接、关闭文件流、锁的 unlock 等。日常中更加推荐 Java 7 引入的 try-with-resources,让 Java 平台处理资源的回收。

try {
    System.exit(); // 程序中断
} catch () {
    System.out.println("hello"); // 这里不会被执行
}
1
2
3
4
5

finally 已被证实是不好的实践。因为 finaly 被设计成在对象被垃圾回收前执行,而 JVM 需额外进行处理,导致对象可能经过几个垃圾收集周期才被回收,可能造成大量对象堆积,引发 OOM 问题。

# finalize

finalize 是 Java 基础类 java.lang.Object 的一个方法,用来保证对象在被垃圾回收前完成特定资源的回收。finalize 机制目前已经不被推荐使用,在 JDK 9中被标记为 deprecated,因为无法保证 finalize 什么时候被执行以及执行得是否符合预期,使用不当可能影响性能,甚至导致程序死锁、挂起等问题。

#Java
上次更新: 2022-12-29
扩展 - int 和 Integer
扩展 - String、StringBuilder、StringBuffer

← 扩展 - int 和 Integer 扩展 - String、StringBuilder、StringBuffer→

最近更新
01
开始
01-09
02
AI工具分享
01-09
03
AI 导读
01-07
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Jason Huang | 闽ICP备2025088096号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式