final IN JVM AND JMM

这篇具有很好参考价值的文章主要介绍了final IN JVM AND JMM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Simply put

In JMM (Java Memory Model), the final keyword is used to ensure visibility and immutability in a multi-threaded environment. In Java, the final keyword can be used to modify variables, methods, and classes, as follows:

  1. Modifying variables: A variable that is marked as final is immutable, meaning its value cannot be changed after initialization. In a multi-threaded environment, using final variables ensures that their values are visible to all threads.

  2. Modifying methods: A method that is marked as final cannot be overridden by a subclass, meaning its behavior is fixed across the entire inheritance hierarchy.

  3. Modifying classes: A class that is marked as final cannot be subclassed, meaning its behavior is fixed across the entire inheritance hierarchy.

In JMM, using the final keyword ensures visibility and immutability in a multi-threaded environment. Specifically, when a thread initializes a final variable, other threads can immediately see the value of that variable. Additionally, because final variables are immutable, they do not require synchronization in a multi-threaded environment, which can improve performance.

JVM 说明

在JVM中,如果使用的是常量池中的字面量(例如字符串、整数等),它们会被缓存在运行时常量池中,并且常量池的地址是固定的,因此这些常量的内存地址是不会改变的。

但是,对于使用常量池中的符号引用来访问常量的情况,由于执行时需要进行解析,并根据符号引用指向的地址找到具体的常量值,因此这些常量的内存地址可能会改变。

在JMM中,由于常量池中的数据已经经过缓存,因此不需要进行同步操作即可进行读取,这对于多线程编程来说是非常有利的。JMM规定了对常量池读取操作的具体执行顺序和内存模型,保证了在多线程情况下常量池的一致性和正确性。

总之,常量池的数据在JVM中的地址是固定的,但是符号引用的解析过程可能会导致常量的内存地址发生改变。在JMM中,常量池的读取操作具有一致性和正确性,可以直接被多个线程访问。

JMM说明

在JMM中,final关键字有以下几个用途:

定义不可变类型的常量:
使用final关键字可以将一个变量定义为常量,使得它的值不能被改变,从而实现不可变类型的常量。

final关键字通常用于声明静态常量或成员常量,常量的值在编译时就确定了,因此不需要在运行时进行同步操作,保证了线程安全性。

声明不可变类型的变量:
使用final关键字可以将一个已经被初始化的变量标记为不可变类型,这个变量的值不能被重新赋值,从而有效地避免了并发修改带来的问题。

保证多线程情况下的可见性:
final关键字可以保证在多线程情况下的可见性和正确性。

当一个final变量被初始化后,它的值对所有线程都是可见的,因此在多线程环境下,读取final变量的值不需要进行同步操作。
同时,final变量的值不能被改变,因此也避免了由于并发修改导致的问题。

总之,在JMM中,final关键字用于保证常量和变量的不可变性、线程安全性和可见性,是一种非常有用的保障机制。文章来源地址https://www.toymoban.com/news/detail-487423.html

到了这里,关于final IN JVM AND JMM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【AI绘画】Stable Diffusion学习——安装与使用教程(一)

    【AI绘画】Stable Diffusion学习——安装与使用教程(一)

    1、Python 官网:https://www.python.org/downloads/ 建议安装3.10开头的版本号,下载安装包后运行即可 (安装python,建议安装3.10.6版本,这个是Stable Diffusion WebUI作者推荐安装版本) 将Python添加到默认路径,否则后面很多调用Python进行的操作都会失灵 安装完成之后,检查Python版本 按

    2024年02月03日
    浏览(12)
  • ICN6202 MIPIDSI转LVDS桥接芯片的功能及特征 调试文档资料

    产品特征功能: 输入:MIPI DSI 支持MIPI ® D-PHY Version 1.00.00 和 MIPI ® DSI Version 1.02.00. 可接收MIPI DSI 18bpp RGB666 and 24bpp RGB888 packets 4 lane data+1 lane clock 4对数据线可以选择1、2、3、4lane data 每对差分数据传输线最大可传输1Gbps,总共最大传输数据4Gbps。 支持mipi低功耗,超低功耗和休眠

    2024年02月14日
    浏览(11)
  • 【运维知识大神篇】超详细的ELFK日志分析教程10(kafka集群原理+基本使用+zookeeper和kafka堆内存调优+kafka监控和压力测试+filebeat和logstash对接kafka)

    【运维知识大神篇】超详细的ELFK日志分析教程10(kafka集群原理+基本使用+zookeeper和kafka堆内存调优+kafka监控和压力测试+filebeat和logstash对接kafka)

    本篇文章继续给大家介绍ELFK日志分析,我们先前介绍了ELFK架构,zookeeper部署使用,kafka的部署,仅差kafka使用就将整个体系融汇贯通了。我们本篇文章将以kafka为核心,详细介绍kafka使用,最终将kafka融入ELFK架构中,大致内容见下面目录。 目录 kafka集群原理 一、专业术语 二、

    2024年02月04日
    浏览(10)
  • Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

    Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

    Vue3前端开发,借助Ref来获取组件内dom对象,借助defineExpose编译宏可以获取到子组件的属性和方法。 app入口文件,我们作为父组件,在里面调用了自定义组件TestCom.vue。 先做了一个测试,借助于ref来访问自身的dom对象。如图所示是可以拿到的。 ref又称谓钩子函数,在vue2版本中

    2024年01月22日
    浏览(12)
  • 【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果

    【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果

    添加程序摇摆和摆动是为任何FPS游戏添加一些细节的非常简单的方法。但是并不是所以的模型动画都会配有武器摆动动画效果,在本文中,将实现如何使用一些简单的代码实现武器摇摆和摆动效果,这比设置动画来尝试实现类似效果要容易得多 新增SwayNBobScript代码 代码挂载在

    2024年01月18日
    浏览(12)
  • 洛谷题单 Part 6.7.1 矩阵

    应队友要求,开始学线性代数,具体路线是矩阵 → rightarrow → 高斯消元 → rightarrow → 线性基。为多项式做个准备 题面 板子,用结构体写的,感觉有点丑,一会儿看看题解有没有写得好看的 题面 搞个方阵 A 3 = [ a 3 a 2 a 1 0 0 0 0 0 0 ] , X = [ 1 1 0 0 0 1 1 0 0 ] , A_3=left [ begin{ma

    2024年02月15日
    浏览(7)
  • 健身管理小程序|基于微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)

    健身管理小程序|基于微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)

    健身管理小程序 目录 基于微信开发健身管理小程序设计与实现 一、前言 二、系统设计 三、系统功能设计  小程序端: 后台 四、数据库设计  五、核心代码  六、论文参考 七、最新计算机毕设选题推荐 八、源码获取:   博主介绍 :✌️大厂码农|毕设布道师,阿里云开发

    2024年04月17日
    浏览(13)
  • 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMI

    1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMI

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月10日
    浏览(16)
  • 【设计规范】TVS管如何选型/浪涌静电防护

    【设计规范】TVS管如何选型/浪涌静电防护

             TVS管作为浪涌静电防护的主力选手,人们往往只看TVS的电压进行选型,这是显然错误的,下面先回顾TVS的相关概念,再对选型与浪涌防护做具体分析。         TVS管在电路当中与被保护线路并联,,当电路正常工作时,它处于截止状态(高阻态),不影响线路

    2024年02月16日
    浏览(9)
  • python运行sh文件

    python运行sh文件

    1. 首先得有一个sh文件 2. 如果windows系统 则需要先下git软件 在Windows操作系统下运行Shell脚本,缺少的只是一个Git软件。其下载路径为Git - Downloading Package。 安装之后,将安装路劲下的 bin文件夹 的路径添加到系统环境变量。 3. cmd中修改路径 (转载) 4. pycharm 中terminal 运行sh文

    2024年02月11日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包