JUC_1-volatile 关键字 内存可见性

基于Web的停车场管理系统:Java Web+MySQL完整业务闭环解析 在Java Web应用开发中,数据库设计与分层架构是决定系统稳定性的核心基础。通过JSP+Servlet+MySQL的经典技术组合,开发者可以清晰理解浏览器请求到数据库响应的完整链路,这种进程可见的架构模式尤其适合教学与工程实践。从业务场景看,停车场管理系统涵盖车位管理、IC卡绑定、临时车计费等真实需求,是学习角色权限、主外键关联和状态字段设计的绝佳样本。无论是高校毕业设计还是企业内网小型系统,掌握这类系统的模块串联与部署排错,能大幅提升对Web应用全流程的掌控力。本文基于一个完整的停车场管理项目,拆解其六 阅读详情

 

volatile 关键字 内存可见性

引入:

一个线程flag值为true了,而另一个线程flag值为false,这是涉及到内存可见性问题

当运行程序时,JVM都会为每一个执行任务的线程分配一个独立的缓存。

    当支线程对主存中的共享资源进行改变时,先会将共享资源读取到支线程的缓存中来,然后对flag值进行改变,再将flag值写到主存中。但在写之前main线程将共享资源读到main线程的缓存中,此时flag值为false;main线程读完以后,支线程flag值写回到主存中,然后执行打印语句flag is true。

    但main线程中的flag值为false;main线程执行while(true)时,while(true)是调用底层代码执行效率高,没有机会对主存中的flag修改的值进行读取,就反复执行 flag值一直都是false。

    这就是内存可见性问题,问题在于多个线程操作共享数据时,都有独立的缓存,对操作的数据彼此是不可见的。

 

    使用同步锁能解决上述问题,但用同步锁效率非常的底,当有多个线程对此代码访问,一个线程持有demo锁,相应其它线程访问以判断有其它线程在占用demo这把锁,这个线程就阻塞挂起,下次等待CPU非配任务再来执行。

    public static void main(String[] args) {

        ThreadDemo demo = new ThreadDemo();

        new Thread(demo).start(); //支线程

        while(true){

            synchronized (demo) {

                if(demo.isFlag()){

                System.out.println("如果flag为true,执行次语句");

                break;

                }

            }

        }

    }

    不想枷锁 但又有内存可见性问题 这时候使用 Volatile关键字   对共享资源加上volatile

volatile 关键字:当多线程进行操作共享数据时,可以保证内存中的数据可见  

volatile调用计算机底层的代码 内存栅栏,时时刻刻缓存将修改的数据实时刷新到主存内中

 

比锁的效率要高  volatile效率低,低在JVM的优化,叫重排序,使用volatile关键字以后不能重排序

 1.volatile相较于sychronized比,volatile是一种较为轻量级的同步策略。

 2.volatile 不具备“互斥性”  sychronized互斥性是一个线程持有锁,其它线程无法进来,当线程释放锁,其它线程才能执行

 3.volatile 不能保证变量“原子性”

public class TestVolatile {

    /* 一、Volatile 关键字:当多线程进行操作共享数据时,可以保证内存中的数据可见 */

    public static void main(String[] args) {

        ThreadDemo demo = new ThreadDemo();

        new Thread(demo).start(); //支线程

        while(true){

            if(demo.isFlag()){

            System.out.println("如果flag为true,执行次语句");

            break;

            }

        }

    }

}

// 旗帜flag原来为false 然后让线程sleep 150ms, 线程睡醒后将flag改为true

class ThreadDemo implements Runnable{

    private volatile boolean flag = false;

    public void run() {

        synchronized (this) {

            try {

                Thread.sleep(150);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            flag = true;

            System.out.println("flag is "+isFlag());

        }

    }

    public boolean isFlag() {

        return flag;

    }

    public void setFlag(boolean flag) {

        this.flag = flag;

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

避坑!瑞萨RZ/N2L用J-Link下载调试的那些‘坑’(从驱动版本到硬件架构选择) 本文详细解析了瑞萨RZ/N2L开发中使用J-Link调试时常见的兼容性问题与解决方案,包括驱动版本选择、SWD连接优化及e2 studio调试技巧。特别针对硬件架构与驱动版本的匹配问题提供了实用对照表,帮助开发者高效避开调试陷阱,提升开发效率。 阅读详情

相关推荐

Labview及NI-USRP驱动安装教程

软件下载 安装使用的LabVIEW2018及NI-USRP驱动程序已上传,下载地址: 天翼云盘链接 (访问码:oc33) 百度网盘链接 (提取码:88mi) (注:天翼云盘下载不限速) LabVIEW2018安装步骤 右键软件压缩包选择解压至LabVIEW2018 选中文件,鼠标右击选择以管理员身份打开2018LV-WinChn.exe文件。 点击确定。 点击Unzip解压。 点击确定。 点击下一步。 填写任意信息后,点击下一步。 点击下一步。 点击浏览更改安装路径建议安装到除C盘以

dadapongi6的博客 2万+

牛客刷题总结7

static修饰的变量属于类,线程在使用这个属性的时候是从类中拷贝一份到线程工作内存的,如果修改线程内存中的值之后再写回到原先的位置,就会有线程安全问题,用static修饰的变量可见性是无法确保的。能保证线程安全(volatile关键字不能保证线程安全,它只是提供了一种弱的同步机制来保证修饰的变量的更新操作通知到其他线程)代码输出“A B C A A B C A B C”选择语句可以嵌套使用(switch case不能嵌套使用)代码输出“A B C A B C A B C”

weixin_52365243的博客 240

Ubuntu18.04 SoftRoCE安装教程

目标:创建两台Ubuntu18.04虚拟机,安装SoftRoCE环境,一台作为Server,一台作为Client,模拟RDMA通信环境,熟悉RDMA的通信方式。

GGGYL111的博客 1551

1、JUC--volatile 关键字-内存可见性

Java JUC简介 在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中的 Collection 实现等 线程实例: public class TestVoatil...

weixin_34111819的博客 99

深入解析FOC电流环PI参数整定:从理论到实践

本文深入解析了FOC(磁场定向控制)中电流环PI参数整定的核心原理与实践方法。文章从永磁同步电机模型出发,详细阐述了基于带宽与零极点对消的工程法及考虑逆变器延迟的二阶系统整定法两种经典策略,并提供了从理论计算到安全上电调试的完整步骤与常见问题解决方案,帮助工程师精准调校电机控制性能。

weixin_29164497的博客 453

ESP32 IDF开发 应用篇⑲ 空中升级OTA

在实际产品开发过程中,在线升级可以远程解决产品软件开发引入的问题,更好地满足用户需求。OTA(空中)更新是使用 Wi-Fi 连接而不是串行端口将固件加载到 ESP 模块的过程。(1)、ESP32 的 OTA 升级有三种方式:·Arduino IDE:主要用于软件开发阶段,实现不接线固件烧写·Web Browser:通过 Web 浏览器手动提供应用程序更新模块·HTTP Server:自动使用http服务器 - 针对产品应用在三种升级情况下,必须通过串行端口完成第一个固件上传。

lu330274924的博客 3326

JUC-1. volatile关键字与内存可见性

一、volatile关键字 适用:当多个线程共享一个变量时,如果有一个线程修改此变量,其他线程读取此变量值。 特性: 内存可见性。 阻止重排序。 注意: 只能确保变量可见性,并不能确保原子性。 volatile不具备“互斥性”。 3. 应用示例 volatile保证了数据可见性。性能比synchronize效率高。 /** * 关键字:volatil...

xbliu564的博客 322

基于opencv-ANN的水果识别模型训练

本文通过opencv-ann-mlp训练模型,实现对五种水果进行分类识别。本文详细介绍该项目的各个过程,包括数据准备、预处理、样本读取、训练数据集制作、训练标签制作、模型参数设置、模型训练,模型测试验证等,总结该过程需要注意的事项。

qq_15985873的博客 3975

1.JUC线程高级-volatile关键字与内存可见性

1. 多线程操作共享变量引发问题 我们通过下面代码来分析下内存可见性问题: package com.pyy.juc; public class TestVolatile { public static void main(String[] args) { // 这个线程为flag 修改值 ...

Lambda 181

[QMT和ptrade量化交易小白入门]-112、小市值热点概念交易策略,回测5年20倍

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1084

【S32K3 MCAL配置】-1.1-GPIO配置及其应用-DIO之高低电平输出-点亮LED灯(基于MCAL)

【S32K3 MCAL配置】-1.1-GPIO配置及其应用-点亮LED灯(基于MCAL)

「汽车电子助手」的博客 1938

JAVA-多线程

(一)juc线程高级特性——volatile / CAS算法 / ConcurrentHashMap 1. volatile 关键字与内存可见性 原文地址: https://www.cnblogs.com/cxxjohnson/p/10432875.html   内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象...

weixin_42768945的博客 165

推荐系统(六)双塔模型

双塔模型是推荐场景中常用的粗排模型之一,本节主要介绍几种典型的双塔模型及其变型,如SENet 双塔模型,并联双塔,蒸馏学习,对偶增强双塔,阿里 COLD。

Jin_Kwok的博客 5146

【JUC并发编程 】 详解Java关键字之 volatile

Java的关键字 volatile 你了解多少呢,详解 volatile!

wanghuichen的博客 1538

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java JUC 高级线程之一 volatile关键字和内存可见性

Java JUC 线程高级一 volatile关键字和内存可见性一、Java JUC 简介二、内存可见性三、volatile关键字四、代码4.1 输出结果分析: 一、Java JUC 简介 在Java5.0提供了java. util. concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO和轻量级任务框架提供可调的...

码农回顾 478

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JUC并发编程之volatile详解

JUC JAVA

qq_43649937的博客 2053

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【JUC进阶】02. volatile关键字

volatile 是 JVM 提供的轻量级的同步机制。volatile 关键字可以保证并发编程三大特征(原子性、可见性、有序性)中的可见性和有序性,不能保证原子性。

有一只柴犬的专栏 947

JUC之volatile关键字

volatile底层实现,深入理解语义,JVM如如何实现volatile的

编程技术圈 1117

【JUC并发 | 第五篇】JMM内存模型 和 volatile关键字

JMM(Java内存模型)是解决多线程并发问题的抽象规范,通过主内存和工作内存机制保证可见性、有序性和原子性。volatile关键字确保变量修改立即刷新到主内存,防止指令重排序但不保证原子性;synchronized通过监视器锁实现原子操作和内存屏障。典型应用如双重检查锁单例模式中,volatile防止对象初始化指令重排序。JMM提供多种原子性保障方式,包括synchronized、Lock和原子类。指令重排序虽能提升性能,但需通过内存屏障规避多线程风险。

h52412224的博客 3993

JUC并发—3.volatile和synchronized原理

于是此时线程1的操作栈顶的n值,就变成了过期数据,所以线程1执行put_field指令后就会把较小的n值同步回主内存中。加锁的方式是首先在每个线程的栈帧中分配一个Lock Record,然后把锁对象中的Mark Word拷贝到Lock Record中,最后把锁对象的Mark Word的指针指向Lock Record。如果有多个线程共享一个并未声明位volatile的long或double类型的变量,且同时对它们进行读取和修改,那么某些线程可能会读取到一个既不是原值,也不是其他线程修改值的"半个变量"的值。

mjunz的博客 1219

Java——聊聊JUC中的volatile与内存屏障

Java——聊聊JUC中的volatile与内存屏障

贝尔摩德苦艾酒 6141

Juc12_Volatile的可见性、不保证可见性、有序性、使用、内存屏障四大指令StoreStore、StoreLoad 、LoadLoad、LoadStore

Juc12_Volatile的可见性、不保证可见性、有序性、使用、内存屏障四大指令StoreStore、StoreLoad 、LoadLoad、LoadStore

所得皆惊喜 7802

volatile可见性详解

volatile可见性详解 volatile是java虚拟机提供的轻量级的同步机制具有以下特点: 1.1.保证可见性 2.2.不保证原子性 1.3.禁止指令重排 ​ 接下来我们先看volatile的可见性的特征,以及底层原理的讲解,那么在研究volatile底层原理之前,我们接下来先要研究一个新的知识–JMM,好,这一题还没讲完呢,猴哥你特么又扯出来一个新的知识点JMM呢?这个时候请按照老师的要求来进行学习,听好去年甚至前年,17 18年面试题上一道必考的题目JVM,这个是java虚拟机,只要是java

weixin_44796239的博客 3552

JUC多线程:JMM内存模型与volatile内存语义

JMM 是 Java 虚拟机定义的一种多线程访问 Java 内存各个变量的访问规范,主要围绕如何解决并发过程中的原子性、可见性、有序性这三个问题来解决线程的安全问题。Java 内存模型将内存分为了主内存和工作内存。主内存存放所有的共享变量,所有线程都可以访问。每个线程都有自己的工作内存,存储了该线程使用到的变量的副本,线程对变量的所有操作都必须在自己的工作内存中完成,不能直接操作主存中的变量。操作时,首先将变量从主内存拷贝到自己的工作内存中,然后在自己的工作内存中对变量进行操作,操作完成后再将变量写回主存

张维鹏的博客 4598

【JUC系列第一篇】-Volatile关键字及内存可见性

作者:毕来生 微信:878799579 什么是JUC? JUC全称 java.util.concurrent 是在并发编程中很常用的实用工具类 2.Volatile关键字 1、如果一个变量被volatile关键字修饰,那么这个变量对所有线程都是可见的。 2、如果某条线程修改了被Volatile修饰的这个变量值,修改后的值对于其他线程来时是立即可见的。 3、并不是经过Volatile...

Holy 343
上一篇: Mysql_流程控制结构
下一篇: JUC_2-原子变量 CAS算法
YanQiu_Only
博客等级 码龄10年 6粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值