在jvm client模式中,不使用volatile也可以保证可见性原因

MODTRAN5.2.1安装配置 阅读详情

为什么线程之间会存在可见性原因?

        JVM运行程序的实体是线程,每个线程在被创建时JVM都会为其创建一个自己私有的工作内存。而Java内存模型规定所有的变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但是线程对这些变量的操作只能在自己的工作内存中进行,不能直接操作主内存中的变量,要先将变量从主内存中拷贝到线程自己的工作内存中再对其进行操作,操作完成后再将操作后的变量写回主内存当中,因此不同的线程也无法访问对方的工作内存,线程间的通信必须通过主内存来完成。

怎样保证可见性

        volatile是java提供的轻量级同步机制,能保证线程可见性,但是不能保证原子性(原理省略)

 但是在以下代码中,会出现没有使用volatile情况下,不同线程仍然保证了可见性:

public class Test {
    static Boolean flag = true;
    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (flag){

                }
                System.out.println("jieshu ");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                flag = false;
                System.out.println("xxxxxxxx");
            }
        }).start();
    }
}

 

原因是什么呢?

        首先我们得知道JVM 有两种启动模式分别为 Server模式与client模式,server模式启动慢但是运行效率比client高很多倍。

      在虚拟机的client模式下,由于JIT并没有做出足够的优化,在Thread2修改flag变量的状态后,Thread1可发现这个改动,并退出程序。但是在server模式下,由于系统优化的结果,Thread1线程无法看到这个改动

Android 15.0 添加自定义服务,并生成jar给第三方app调用 在15.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 阅读详情

相关推荐

Altium Designer学习---如何进行SI仿真

Altium designer 如何进行SI仿真。         1、仿真电路中需要至少一块集成电路;             2、器件的IBIS模型;              3、在规则中必须设定电源网络和地网络;              4、建立SI规则约束;              5、层堆栈必须设置正确,电源平面必须连续;     建立的文件必须是一个工程,并把相应的文件放在工程目...

weixin_34050519的博客 4904

volatile研究

发现之前认为的,可以避免编译器优化导致线程内部引用的外部变量的修改不可见·······结果昨天测了很多···并且发现编译器乱改我的代码·······所以感觉volatile的作用还是比较虚幻的(跟传说一样,虚)······后来了解C语言中也许会明显一点,因为传言volatile的作用要从汇编指令级别的代码才能看出区别········· 但是传言需要从汇编码才能看出区别,我没有去测····

度窝-笔记 333

stm32f103c8t6的中文字库

stm32的成熟中文字库,上手即用,操作简单

nbbskk的博客 3653

为什么不使用volatile,其它线程也能得到当前线程修改后的值,不使用volatile也不存在可见性问题?原来解决可见性问题不一定需要volatile,println也可以

1. 可见性 可见性指多线程编程下,其中一个线程修改了变量的值,其它的线程能得到修改后的值。 2. 为什么不使用volatile,其它线程也能得到变量修改后的值 实验代码分析: ① 初始变量a=0,b=false; ②然后,一个线程判断b 的值是否为false,是false那么循环输出“b is false and a is ”信息,直到 b 的值变为true,输出“b is true and a is”信息结束线程; ③然后延迟2ms,为了让后面的线程晚于前面线程执行; ④最后,另一..

走过路过不要错过 3532

智能车竞赛飞檐走壁组赛道制作全攻略:从电磁线铺设到立体元素搭建

本文提供了智能车竞赛飞檐走壁组赛道制作的完整指南。从电磁线选材、电流控制与精准铺设等基础入手,详细解析了垂直墙面、圆筒、跷跷板等核心立体元素的构建技巧与过渡处理。重点分享了确保赛道稳定、符合规则且便于调试的实战经验,帮助参赛队伍搭建可靠的立体赛道,为车模算法调试奠定坚实基础。

weixin_29292535的博客 1289

uniapp - 微信小程序接入官方人脸识别认证详细流程及示例源码,Uniapp微信小程序项目集成官方提供的人脸识别身份验证插件接口(多种示例:人脸核验、身份证件与人脸是否匹配、是否活体、实名认证等)

uni-app微信小程序人脸识别认证,使用uniapp开发微信小程序的人脸采集功能/人脸识别功能,uniapp vue3微信小程序活体人脸识别,Uni-app微信小程序实名认证,uniApp微信小程序人脸认证,UniApp的微信小程序实名认证与人脸识别系统开发,人脸核身微信小程序uni-app接入流程,wx.startFacialRecognitionVerify,uniapp开发微信小程序-人脸采集功能、微信人脸识别实名认证集成指南,识别失败,人脸识别接口怎么调用,前后端完整示例代码demo,人脸检测功能

🏆 前端领域优质创作者 3284

咦,咋没加volatile,变量也可见的呢?

本想今天复习一下volatile的,结果在写demo时,怎么也达不到效果。还以为写错的呢。最后发现是 System.out.printlnr惹的祸。 我的demo如下: 定义一个变量控制线程的中断。 最初的demo是这样的: class Test1{ //public volatile static int num =0; public static int num =0; public static void main(String[] args) { new Th

LoveMyLife 1604

YOLO26涨点改进| CVPR 2026 | 独家创新首发、特征融合改进篇 | 引入 LFSB 差分双维注意融合模块,通过交替特征融合与分离策略,能够精准区分目标特征,顶会助力YOLO26有效涨点

本文提出LSFB差分双维注意融合模块,用于改进YOLO26目标检测模型。该模块通过融合-分离交替策略和差分注意力机制,有效提升模型在复杂场景下的特征分离能力,特别是在处理重叠物体或反射干扰时表现优异。LSFB采用双向投影、双维注意力计算和跨流减法算子,实现特征共享与独立提取的平衡。实验表明,该模块能显著减少特征混淆,提高检测精度和鲁棒性。文章还详细介绍了模块实现的核心代码、YAML配置文件修改方法以及三种改进方案,为YOLO26模型性能提升提供了创新解决方案。

Ai缝合怪、助力小伙伴高效发论文 326

不加volatile同样可见

关于jvm优化

weixin_45835632的博客 576

微信小程序 - 最新实现项目适老化设计全流程及源码,老年模式大字版与常规版页面样式切换,老年人大字模式字体与布局更换关怀版解决方案(新老项目均适用的方案,全局页面统一修改文本字号/DOM排版元素等)

微信小程序,vue2,vue3,老年大字版设计,小程序开发如何实现适老化方案,放大字体字号及改变页面的布局,小程序关怀模式实现思路及代码,统一将布局都改了,全局修改字体大小适配老年人看不清问题,小程序怎么接入老年模式并根据模式改变页面的UI设计,实现全局修改字体大小适老化/关怀版改造,最新详细示例代码全流程,字体放大/缩小,老项目怎么适配老年人模式方案,小程序适老化设计指南,当切换成老年模式时页面所有排版都会发生变化,小程序vue开发,新手详细教程,老年模式字体设置思路和UI布局的设计,开发者可以通过wx.

🏆 前端领域优质创作者 7309

2025美赛E题为农业留出空间(附代码+全保姆教程)Making Room for Agriculture

有机农业的核心在于减少化学投入,促进自然控制和可持续性。变量定义CCC: 作物种群III: 害虫种群PPP: 天然捕食者种群(蝙蝠、鸟类等)BBB: 生物多样性水平(以种类数量表示)SSS: 土壤健康指数(影响植物繁殖与作物生长)EEE: 农业生态系统的整体稳定性。

博客 1496

java static 可见性_java多线程学习二:::如何验证volatile保证数据的可见性和有序性?...

如何验证volatile保证数据的可见性和有序性?第一点:首先判断你的java环境中jvm是client模式还是server模式Java HotSpot Client VM:为在客户端环境中减少启动时间而优化;比较适合桌面程序,它会做一些例如像快速初始化,懒加载这一类的事件来适应桌面程序的特点。Java HotSpot Server VM:为在服务器环境中最大化程序执行速度而设计; 适合做服务器程...

weixin_33648177的博客 205

基于simulink的车道保持辅助系统(LKA)的仿真与实现

本文介绍了如何利用Simulink实现车道保持辅助系统(LKA)的仿真与建模。首先对比了车道偏离预警(LDW)和LKA的功能差异,强调LKA的主动干预特性。接着详细阐述了LKA系统架构,包括环境感知、决策控制等核心组件,并基于自行车模型建立车辆横向动力学方程。 文章重点演示了Simulink建模步骤:搭建车辆动力学模型、设计LKA控制器(采用LQR算法)、实现执行器接口和驾驶员干预检测。通过四个典型场景的仿真测试,验证了系统在直道行驶、弯道跟踪等工况下的控制性能,并给出了关键评价指标。最后展望了MPC控制、

amy_mhd的博客 228

JDK Client & Server 变量可见性问题

JDK Client & Server 变量可见性问题 下面主要是引出不同jdk对成员变量的处理 背景 一天在群里吹逼的时候,有位老哥发了一段代码出来,他说他运行的结果和网上的不一致。然后我们分别在各自的环境运行了,我们的结果和网上的运行一致。代码如下(你们可以拷贝到自己环境测试一下,大概率都是第二种结果): public class VisibilityTest { pri...

qq22692150的博客 302

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java怎么保证线程的有序性_java多线程学习二:::如何验证volatile保证数据的可见性和有序性?...

如何验证volatile保证数据的可见性和有序性?第一点:首先判断你的java环境中jvm是client模式还是server模式Java HotSpot Client VM:为在客户端环境中减少启动时间而优化;比较适合桌面程序,它会做一些例如像快速初始化,懒加载这一类的事件来适应桌面程序的特点。Java HotSpot Server VM:为在服务器环境中最大化程序执行速度而设计; 适合做服务器程...

weixin_42318812的博客 249

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

synchronized和volatile解决线程可见性

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34015860的博客 147

java volatile 理解_java volatile关键字的理解

转载:http://shmilyaw-hotmail-com.iteye.com/blog/1672779一个多线程的示例引发的问题在讨论这个关键字之前先看一个多线程的示例代码:Java代码publicclassRaceCondition{privatestaticbooleandone;publicstaticvoidmain(finalString[]args)th...

weixin_35251837的博客 136

Java volatile 汇编代码研究

一个程序 我们有下面这段程序代码: <pre> package edu.hushi.jvm; /** * * @author -10 * */ public class VisibilityTest extends Thread { private boolea...

chonggou9369的博客 361

Java多线程volatile关键字

JVM中,分为JVM Client模式,JVM Server模式。两者区别并不大,但serve启动模式启动较慢,但一旦运行起来后,在hash和method call方面的效率,比Client模式效率高数十倍。 线程在读取数据时,首先从主内存中读取数据,保存在本地工作内存中,然后对数据进行修改,修改完毕后,写入本地工作内存中,再从工作内存写入主内存。示例图如下: JVM如果以Serve...

weixin_30249203的博客 76

创建型模式-单例模式

单例模式是一种创建型设计模式,确保类只有一个实例并提供全局访问点。分为饿汉式(类加载时创建)和懒汉式(首次使用时创建)。饿汉式通过静态变量或静态代码块实现,可能造成内存浪费;懒汉式存在线程安全问题,可通过加锁或双重检查锁解决,后者需配合volatile防止指令重排序。静态内部类方式利用JVM类加载机制保证线程安全和延迟加载。枚举方式是最推荐的实现,天然线程安全且防反射破坏。单例模式可能被序列化和反射破坏,需额外处理。

yisaxieer的博客 475

java volatile的一个验证反例(转)

网上关于java volatile的资料已经不少了,但搜了好久也没看到谁用代码很好地验证过使不使用volatile的差异。最近自己写了个测试,意外的看到了两者的明显区别,为什么说意外呢,因为根据我的测试,在32位的JVM(以下均指oracle官方的JVM)上是看不出差异的,也就是说32位的JVM上,不会发生因为没使用volatile而引起的多个线...

weixin_34256074的博客 107

JVM执行篇:使用HSDIS插件分析JVM代码执行细节--转

http://www.kuqin.com/java/20111031/314144.html 在《Java虚拟机规范》之中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、对局部变量表的影响等细节。这些细节描述与Sun的早期虚拟机(Sun Classic VM)高度吻合,但随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述产生越来越大的差距,虚拟机...

139

JUC、JVM

什么是juc?JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包。提供了许多在并发编程工程中常用的工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO、轻量级框架、还提供了多线程上下文的Collectiion的实现。什么是进程和线程?一个软件一个进程,一个进程有许多的线程。进程——资源分配最小单位  线程——程序执行最小单位New 新建状态(线程刚被创建,start方法之前的状态)

qq_42012853的博客 2029

JAVA多线程内存可见性

首先来解释什么是JAVA内存的可见性**共享变量:**:某一个变量在多个线程的工作内存中都存在副本,那么这个变量就成为这几个线程的共享变量 **可见性**:就是一个线程对共享变量的修改,可以及时的被其他线程看到 JMM(JAVA Memory Model):是描述java程序中各种变量的访问规则。以及在JVM中将变量存储,和读取的细节.(针对线程的争用) 以下来详细介绍线程的工作机制。 在此

奔波儿灞 291

Java面试核心考点:JVM、集合框架与多线程详解

Java作为企业级开发的主流语言,其核心技术体系涵盖JVM内存管理、集合框架与多线程并发等核心模块。JVM通过堆内存分区与GC算法实现高效内存回收,其中标记-清除、复制算法等不同策略适用于不同场景。集合框架中ArrayList与LinkedList的底层实现差异直接影响数据操作效率,而HashMap在JDK8引入红黑树优化解决了哈希冲突问题。多线程编程涉及synchronized锁升级机制与volatile内存可见性保证,合理配置线程池参数可显著提升系统并发能力。这些基础原理不仅是Java开发的基石,更是大

anjichan4261的博客 412

设计模式(一) - 建造者模式、单例模式、工厂模式

本文系统介绍了三种常见设计模式:单例、工厂和建造者模式。单例模式保证全局唯一实例,分为饿汉式(类加载创建)和懒汉式(延迟加载+DCL双重检查锁),枚举单例是线程安全的最佳实践。工厂模式封装对象创建,包含简单工厂(if-else判断)、工厂方法(每个产品对应工厂)和抽象工厂(生产产品族)。建造者模式适用于复杂对象的分步构建,通过链式调用提高可读性,常用于多字段实体类创建。三种模式核心区别:单例控制实例数量,工厂直接提供完整对象,建造者关注组装过程。文章详细分析了各种实现方式的优缺点、适用场景及线程安全问题,并

weixin_45839019的博客 283
下一篇: java面试总结
从小爱玩水
博客等级 码龄8年 5粉丝 5原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值