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模板网!

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

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

相关文章

  • Maven多仓库配置

    Maven多仓库配置

    有两种方式配置Maven多仓库 setting.xml文件的profiles标签 pom.xml文件的repositories标签 在使用多仓库配置时,不管使用哪种方式,必须先将setting.xml文件中的mirrors标签修改为如下内容(如果有mirrors标签),关键是mirrorOf千万不要写成*,否则多仓库配置不生效 两种方式可以同时使用

    2024年02月12日
    浏览(5)
  • python中cv2.projectPoints的用法

    python中cv2.projectPoints的用法

    我们先看一下c++ 中的参数解释 第一个输入的点是一个, (N, 3) 维的 三维坐标系中的点, xyz 第二个是旋转向量, 第三个是平移向量. 第四个是相机内参, 第五个是相机的畸变系数, 如果输入是4个时, 就是[k1, k2, p1, p2], 输入5个时就是 [k1, k2, p1, p2, k3], 也可以是更多, [k1, k2, p1, p2, k3,

    2024年02月06日
    浏览(9)
  • Unity - 记一次非正规变体优化带来的兼容性导致部分手机卡死的问题

    Unity - 记一次非正规变体优化带来的兼容性导致部分手机卡死的问题

    在 2023.4.6 我们的 角色展示界面 就遇到了 华为手机,red mi note 11 的测试手机上的 后 2023.5.24 再次遇到类似的问题,但是这次重现的地方很多,不单止 角色展示界面 遇到 排除过: 模型 特效 场景 人物 材质 后来多次排查,发现是 PBR 所有的 变体拆分优化 的文件导致阴影部分

    2024年02月08日
    浏览(13)
  • 关于出版《AR Foundation增强现实开发实战(ARKit版)》(2023-04-05更新)

    关于出版《AR Foundation增强现实开发实战(ARKit版)》(2023-04-05更新)

    感谢各位读者的支持,书籍目前已上市各大电商平台。 ----------- 2022年9月11日创建 ---------   ARKit是苹果公司在前沿科技领域的重大技术布局,也是目前移动领域AR应用开发引擎标杆。得益于良好的软硬件生态整合,ARKit运动跟踪稳定性好、性能消耗低、功能特性丰富,利用它

    2023年04月09日
    浏览(10)
  • Linux(openssl):通过编程检查证书是否为selfsign

     可以通过openssl提供的库函数验证 Linux(openssl):创建selfsign证书-CSDN博客 生成的正式是否为selfsign 

    2024年02月06日
    浏览(4)
  • unity 之 如何获取父物体与子物体

    unity 之 如何获取父物体与子物体

    在Unity中,你可以使用 Transform 组件的属性来获取对象的父物体。以下是在C#脚本中如何获取父物体的示例代码: 在这个示例中, transform 代表当前脚本所附着的物体的Transform组件。通过访问 transform.parent 属性,你可以获取当前物体的父物体。如果当前物体没有父物体(例如是

    2024年02月07日
    浏览(10)
  • PHP中读取(截取substr)字符串前N个字符或者从第几个字符开始取几个字符

    ```html ?php $str = \\\"123456789\\\";echo substr($str , 0 , 3);//从左边第一位字符起截取3位字符:结果:123echo substr($str , 3 , 3);//从左边第3位字符起截取3位字符:结果:456? ``` ```html ?php$rest = substr(\\\"abcdef\\\", -1);    // 返回 \\\"f\\\"$rest = substr(\\\"abcdef\\\", -2);    // 返回 \\\"ef\\\"$rest = substr(\\\"abcdef\\\", -3, 1); // 返回

    2024年02月20日
    浏览(8)
  • 深度学习:交叉验证(Cross Validation)

    深度学习:交叉验证(Cross Validation)

    首先,交叉验证的目的是为了让被评估的模型达到最优的泛化性能,找到使得模型泛化性能最优的超参值。在全部训练集上重新训练模型,并使用独立测试集对模型性能做出最终评价。 目前在一些论文里倒是没有特别强调这样的操作,很多研究使用的都是第一种:简单交叉验

    2024年02月02日
    浏览(10)
  • Linux复习——基础知识

    Linux复习——基础知识

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 1. 有关早期linux系统中 sysvin的init的7个级别描述正确的是(    )[选择1项] A. init 1 关机状态     B. init 2 字符界面多用户模式

    2024年02月15日
    浏览(11)
  • 搞懂flyaway一篇就够了

    Flyway是一个用于数据库迁移的开源工具,它可以帮助开发人员轻松地管理数据库架构的变化。Flyway通过迁移来更新数据库,迁移可以使用特定于数据库的SQL语法或者用于高级数据库转换的Java编写。Flyway支持两种类型的迁移:有版本的迁移和可重复的迁移。有版本的迁移具有唯

    2024年02月03日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包