Java中final关键字的理解(多线程中的final)

news2024/11/28 10:56:53

一、final关键字

        Java中的final关键字具有不可变性的特性,其可以修饰类、方法和变量。

1. final修饰类:final关键字可以用来修饰类,表示该类是不可继承的。final类中的所有方法都是隐式final的(不能被override或shadow)。

2. final修饰方法:final关键字还可以用来修饰方法,表示该方法不能被子类进行重写override。

3. final修饰变量:final关键字可以用来修饰变量,表示该变量只能被赋值一次,一旦被赋值,就不能再修改。final变量在Java中也被称为常量而且通常常量名要大写。

(空白final:没有在声明时初始化 final 变量的称为空白 final 变量(blank final variable),它们必须在构造器中初始化,或者调用 this() 初始化,不这么做的话,编译器会报错final变量(变量名)需要进行初始化)

 

二、final与finally和finalize的区别

        虽然final、finally和finalize这三个关键字的拼写相似,但是它们的作用却是不同的。下面是它们的区别:

  1. final关键字:表示一个不能被修改的常量、类不能被继承或者类的方法不能被重写。

  2. finally关键字:表示一个代码块,在try-catch-finally语句结构中,无论是否发生异常都会执行finally语句块中的代码。

  3. finalize方法:是Object类中的一个方法,用于对象的垃圾回收。当垃圾回收器确定不存在对该对象的更多引用时,finalize方法被调用。

        简单来说,final用于声明常量或不可更改的对象/属性,finally用于保证在程序执行过程中一定会被执行的代码块,而finalize则是与对象的垃圾回收相关的方法。需要注意的是,对于final和finally关键字,它们有不同的语法和用途,应该避免将它们混淆。而finalize是一个方法,虽然可以重写它,但由于它的执行是由垃圾回收器触发的,因此一般情况下不会在代码中直接使用该方法。

三、final关键字在多线程中的理解和使用

        如果一个对象可以被多个线程访问到,但是并没有被声明为final,那么你需要提供额外的线程安全机制。其他的方式包括声明为volatile 、使用synchronized、显示锁等。

在多线程程序中,final关键字的作用可以体现在两个方面:

(1)final变量可以在多线程环境下提供不可变性,避免了多线程之间的竞争问题。

(2)final关键字可以用来修饰引用类型变量,在多线程环境中,可以避免对象的引用被改变。

final Runnable r = new Runnable() {
public void run() {
// ...
    }
};

        在上面的代码中,r是final变量,因此其在多线程环境下是不可变的,即使多个线程访问它的时候,也不会产生竞争问题。

在Java核心技术中可以看到:

        总之,final关键字的作用是提供了不可变性、安全性和线程安全性,可以在程序设计中发挥重要的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习-第1篇】深度学习是什么、能干什么、要怎样学?

大概4年前本专栏发布了一篇关于神经网络的入门科普文章,到现在大概有小5k赞了(Mr.看海:神经网络15分钟入门!足够通俗易懂了吧)。 这几年人工智能发生了突飞猛进的发展,时至今日甚至发展出了GPT-4、Midjourn…

经典高并发服务器设计逻辑

都是面试必问的八股,不管理不理解用不用得上,背就完事了。 服务器模型 对于并发量比较大的服务器,即listen监听端口一直忙碌于处理新建连接的场景,一般在主线程里面accept新的客户端连接并生成新连接的socket,然后将这…

Unity制作二次元卡通渲染角色材质——2、色阶化光影的多种做法对比

Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续讲二次元角色渲染。之前说过,最基本的卡通渲染,包含了色阶化光影和描边二个元素。所以这里先来说一下色阶化光影的多种做法对比。 一、光照模型和色阶化的说明 从上一篇文章里…

拿捏-哈夫曼树构建及编码生成(建议收藏)

文章目录 哈夫曼树的基本概念哈夫曼树的构建构建思路代码实现 哈夫曼编码的生成编码生成思路代码实现 完整代码展示及代码测试 哈夫曼树的基本概念 在认识哈夫曼树之前,你必须知道以下几个基本术语: 1、什么是路径? 在一棵树中,从…

Kafka 分区

分区是 Kafka 的核心功能,对于 Kafka 的存储结构、消息的生产消费方式都至关重要。 Partition(分区) 每 topic 都可以分成多分区,每个分区都是一组有序的、不可变的记录序列,每个分区在存储层面是 append log 文件。…

python中Requests发送json格式的post请求方法

问题:做requests请求时遇到如下报错: {“code”:“500”,“message”:"JSON parse error: Cannot construct instance of com.bang.erpapplication.domain.User (although at least one Creator exists): no String-argument constructor/factory …

唠一唠程序员的那些事

作为一名互联网摸爬滚打多年的老兵,我可以从以下角度提供一些信息: 加班是家常便饭:程序员往往需要加班来满足项目需求或完成任务。这意味着他们经常会在晚上、周末或节假日工作。代码不仅仅是工作:对于大多数程序员来说&#xff…

【C++】成员对象和成员函数分开存储

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、详解 3、代码清单 1 3.1、类中定义成员变量 3.2、类中定义成员函数 4、代码清单 2 5、总结 1、缘起 “成员变量…

SpringBoot 增强Controller方法,@ControllerAdvice注解的使用

参考资料 ControllerAdvice 用法SpringBoot使用ControllerAdvice注解 目录 一. ControllerAdvice注解作用二. ControllerAdvice注解 assignableTypes属性2.1 ControllerAdvice增强类2.2 Controller层2.3 效果 三. ControllerAdvice注解 basePackages属性3.1 ControllerAdvic…

踩坑|以为是Redis缓存没想到却是Spring事务!

前言 最近碰到了一个Bug,折腾了我好几天。并且这个Bug不是必现的,出现的概率比较低。一开始我以为是旧数据的问题,就让测试重新生成了一下数据,重新测试。由于后面几轮测试均未出现,我也就没太在意。 可惜好景不长&…

【LeetCode】260. 只出现一次的数字 III

260. 只出现一次的数字 III(中等) 思路 这道题是136. 只出现一次的数字 的进阶版,需要找出两个仅出现一次的元素。有了上一题的基础,我们很容易就想到要用异或来解决,但是由于这题最终会剩下两个不同的元素&#xff0…

设置和使用DragGAN:搭建非官方的演示版

DragGAN的官方版还没有发布,但是已经有非官方版的实现了,我们看看如何使用。DragGAN不仅让GAN重新回到竞争轨道上,而且为GAN图像处理开辟了新的可能性。正式版本将于本月发布。但是现在已经可以在一个非官方的演示中试用这个新工具了 DragGAN…

数据结构:二叉树(初阶)

朋友们、伙计们,我们又见面了,本期来给大家解读一下二叉树方面的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 …

Unix/C/C++进阶--SocketCAN 编程

Unix/C/C进阶--SocketCAN 编程 1 介绍1.1 socketcan 简介1.2 can 发展历程1.3 can总线优点 2 知识点2.1 CAN详解--书籍、网站2.2 CAN详解--CAN与com口介绍2.3 CAN详解--各家CAN分析仪与软件的比较2.4 转载:CAN总线终端电阻2.5 如何破解汽车--CAN协议(can…

3.8 电路布线

博主简介:一个爱打游戏的计算机专业学生博主主页: 夏驰和徐策所属专栏:算法设计与分析 1.最优子结构的证明: 我的理解: 对于电路布线问题的最优子结构性质,我们可以通过数学推导进行证明。下面是对证明的…

conda在 powershell下不能激活虚拟环境

这里写自定义目录标题 问题原因解决办法增加环境变量修改PowerShell 策略初始化conda环境安装或更新conda 结果 问题原因 powershell正常是不行的,但是在cmd中是可以的 问题产生的原因有很多: 必须无法识别activate.bat激活无反应 解决办法 增加环…

【JavaSE】Java基础语法(四十六):枚举

文章目录 1. 概述2. 定义格式3. 枚举的特点4. 枚举的方法 1. 概述 枚举是一种特殊的数据类型,它列出了一组预定义的常量,并使用标识符来引用这些常量。枚举的用途很广泛,下面列举了几个常见的应用场景: 管理常量:如果您…

计算机组成原理---第三章存储系统 习题详解版

(一)精选课内习题 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 (二)精选课后习题 1.设有一个具有20位地址和32位字长的存储器,问: (1)该存储器能存储多少个字节的信息? (2)如果存储器由512k8位的SR…

Linux :: vim 编辑器:详解:文本复制/粘贴/剪切/删除 与 撤销普通操作及撤销撤销操作

前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C 入门到入土!!!学习合集Linux 从命令到网络再到内核!学习合集 前文&#x…

chatgpt赋能python:Python去掉None:提高代码效率,优化SEO

Python去掉None:提高代码效率,优化SEO 作为一名有10年Python编程经验的工程师,我发现Python中会频繁出现None类型的变量。这种情况在代码中一旦过多,就会影响程序的效率,同样也会影响SEO的排名。因此,为提…