码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java——》可见性


    推荐链接:
        总结——》【Java】
        总结——》【Mysql】
        总结——》【Redis】
        总结——》【Kafka】
        总结——》【Spring】
        总结——》【SpringBoot】
        总结——》【MyBatis、MyBatis-Plus】
        总结——》【Linux】
        总结——》【MongoDB】
        总结——》【Elasticsearch】

    Java——》可见性

    • 一、概念
      • 1、可见性问题
      • 2、为什么会有可见性问题
      • 3、数据同步过程
    • 二、在Java中保证可见性的方式
      • 1、volatile
      • 2、synchronized
      • 3、Lock锁
      • 4、final

    一、概念

    可见性是指线程间的,对变量的变化是否可见。通常被解释为将线程本地状态反映到主内存上,volatile就是负责保证可见性的。

    1、可见性问题

    可见性问题是指一个线程修改了一个共享变量的值,但是另一个线程无法立即看到这个修改后的值。

    2、为什么会有可见性问题

    CPU处理速度非常快,相对CPU来说,去主内存获取数据这个事情太慢了,CPU就提供了L1,L2,L3的三级缓存,每次去主内存拿完数据后,就会存储到CPU的三级缓存,每次去三级缓存拿数据,效率肯定会提升。

    因为每个线程都有自己的工作内存(CPU三级缓存),线程之间无法直接访问对方的工作内存,只改自己的工作内存,没有及时的同步到主内存,导致一个线程对共享变量的修改对其他线程不可见,从而出现数据不一致。

    3、数据同步过程

    CPU在处理时,需要将主内存数据刷新到寄存器中再执行指令,执行完指令后,再将寄存器数据刷新到主内存中。遵循MESI协议,不是每次操作结束都将CPU缓存数据同步到主内存。
    image.png

    二、在Java中保证可见性的方式

    1、volatile

    参考链接:Java——》volatile

    保证每次CPU操作数据时,修改后的值立即被写回主内存,其他线程在读取该变量时可以直接从主内存中获取最新值

    2、synchronized

    参考链接:Java——》synchronized保证可见性

    确保同一时刻只有一个线程访问共享变量,从而避免了多线程并发访问时对共享变量的竞争和冲突

    3、Lock锁

    参考链接:Java——》ReentrantLock

    image.png

    4、final

    final修饰的属性,在运行期间是不允许修改的,这样一来,就间接的保证了可见性,所有多线程读取final属性,值肯定是一样。

    Q:final和volatile不允许同时修饰一个属性?
    A:final修饰的内容已经不允许再次被写了,而volatile是保证每次读写数据去主内存读取,并且volatile会影响一定的性能,就不需要同时修饰。
    image.png

  • 相关阅读:
    数据结构和算法(3):列表
    一步一图带你深入剖析 JDK NIO ByteBuffer 在不同字节序下的设计与实现
    Team Finance被黑分析|黑客自建Token“瞒天过海”,成功套取1450万美元
    Vant轮播多个div结合二维数组的运用
    netcore基于asp.net的校园二手闲置商品交易系统
    走进Redis:哨兵集群
    孟德尔随机化写作技巧mr
    软件测试生命周期包括哪些阶段?CMA、CNAS软件测试报告有什么作用?
    人造肉在中国还有未来吗?
    Autosar MCAL配置——SPI(EB)
  • 原文地址:https://blog.csdn.net/weixin_43453386/article/details/134251790
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号