volatile使用

本文详细解释了Java中的volatile关键字如何确保线程之间的可见性和一致性。通过强制线程从共享内存中读取volatile变量的最新值,避免了因使用本地内存拷贝而导致的数据不一致问题。
在当前的Java内存模型下, 线程可以把 变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个 变量的值,而另外一个线程还继续使用它在 寄存器中的变量值的拷贝,造成数据的不一致。
要解决这个问题,只需要像在本程序中的这样,把该 变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
Volatile修饰的 成员变量在每次被 线程访问时,都强迫从 共享内存中重读该成员变量的值。而且,当 成员变量发生变化时,强迫线程将变化值回写到 共享内存。这样在任何时刻,两个不同的线程总是看到某个 成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享 成员变量的私有拷贝,而且只当线程进入或者离开 同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享 成员变量的变化。
而volatile 关键字就是提示VM:对于这个 成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的 成员变量上使用volatile。当要访问的 变量已在synchronized代码块中,或者为 常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的 代码优化,所以在效率上比较低,因此一定在必要时才使用此 关键字
 

正确使用 volatile 变量的条件

您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的 线程安全,必须同时满足下面两个条件:
● 对 变量的写操作不依赖于当前值。
● 该 变量没有包含在具有其他变量的不变式中。
实际上,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。
第一个条件的限制使 volatile 变量不能用作 线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而 volatile 不能提供必须的原子特性。实现正确的操作需要使 x 的值在操作期间保持不变,而 volatile 变量无法实现这点。(然而,如果将值调整为只从单个线程写入,那么可以忽略第一个条件。)
32单片机,c语言编程,头文件名stm32f10x.h,只用给出主函数就行 首先,在开始的时候,OLED显示:“want to chat with me?”此时你可以选 择向单片机通过串口发送1或者2。1(好的,我想跟你聊呢)、2(对不起,我要忙着 学习呢)。 发送2后,LED灯开始呼吸,且呼吸速率逐渐加快,OLED显示“I am angry!!!”。这句话的下面显示time的倒计时,“time = x”,x从3逐渐变为 0。一秒钟减1,减为0时,LED灯熄灭,OLED重新显示“want to chat with me?”并且下面显示“you have x chances”,x初值是3,也就是说总共有3次机 会,每拒绝一次女友就会少一次机会,当chances的值减为0时,不再显示“want to chat with me?”和“you have x chances”,直接显示:“woohoo,let’s break up”(中文翻译为“呜呜呜,我们分手吧”),LED灯开始闪烁,每一秒钟 闪烁一次。5秒后程序重启。 发送1后,LED灯亮起,但是亮度为完全亮的一半亮度。OLED显示:“say please.....”此时可以向串口发送数字,通过数字来选择和女友聊天的内容。 发送1的话(聊天内容是天气如何),OLED显示:“what’s the weather like?”(估计显示不下,只要求必须显示关键词weather) 发送2的话(聊天内容是你喜欢我哪里),OLED显示:“what do you like about me?”(估计显示不下,只要求必须显示关键词like) 发送3的话(聊天内容是你曾经谈过几次恋爱),OLED显示:“how many times have you been in love?”(估计显示不下,只要求必须显示关键词in love ) 发送4的话(聊天内容是你有多爱我),OLED显示:“how many do you love me?”(估计显示不下,只要求必须显示关键词love me) 然后当你按下按键后,OLED下面显示倒计时“time = x”,x的值从9逐渐减 少,一直到0为止。在此过程中LED灯闪烁,并且闪烁速率逐渐加快。你必须在这10 秒内向串口发送你的答案, 如果没有time的值到0时,还没有发送完答案,那么LED灯将熄灭。并且OLED 显示:“woohoo,you do not love me”(中文翻译为“呜呜呜,你不爱我了”) 持续5秒OLED屏幕闪烁。然后,重新进入问问题阶段。但是LED灯的亮度明显变 暗。 如果及时发送了正确答案的话,那么LED灯将满亮。并且OLED显示:“I love you!!!”(此处不进行翻译)持续3秒OLED屏幕闪烁。然后,重新进入问问题阶 段。但是LED灯的亮度明显变亮。 LED灯的亮度有5个阶段,刚开始处于第3个阶段每一次成功答对问题,LED灯亮 度增加,第5阶段为满亮,第一阶段为熄灭。如果到了满亮或熄灭阶段,不必重新进 入问问题阶段。OLED屏幕闪烁完毕后,OLED显示:“let’s get married!!!”或 者“let’s break up now!!!”持续3秒后,程序重启。 (接下去,LED灯变成什么状态,就要执行相应的程序) 第一题的答案有:S(晴朗)、R(下雨)、W(多云)。回答任意一个即为正 确。 第二题的答案有:A(外貌)、S(灵魂)、L(都有)。只有回答L才是正确。 回答A或者SLED灯亮度减小一个阶段。 第三题的答案有:回答0是正确答案,1-3为半对答案,LED灯亮度减小一个阶 段,4以上LED灯直接熄灭。 第四题的答案有:回答10是正确答案,8或9为半对答案,LED灯亮度减小一个阶 段,6或7为半对答案,LED灯亮度减小两个阶段,6以下LED灯直接熄灭。 要求:在发完答案后,串口会把你的答案在屏幕上显示出来,格式为“your answer is xxx”  如果发送其他数字的话(选择除了1 2 3 4之外的题目),或者答案不在正确答案 范围里。说明你根本不了解你的女友,LED灯直接熄灭。只用给出主函数,主函数             
06-01
整个编程用一个主函数搞定。32单片机,c语言编程,头文件名stm32f10x.h,oled是4口 首先,在开始的时候,OLED显示:“want to chat with me?”此时你可以选 择向单片机通过串口发送1或者2。1(好的,我想跟你聊呢)、2(对不起,我要忙着 学习呢)。 发送2后,LED灯开始呼吸,且呼吸速率逐渐加快,OLED显示“I am angry!!!”。这句话的下面显示time的倒计时,“time = x”,x从3逐渐变为 0。一秒钟减1,减为0时,LED灯熄灭,OLED重新显示“want to chat with me?”并且下面显示“you have x chances”,x初值是3,也就是说总共有3次机 会,每拒绝一次女友就会少一次机会,当chances的值减为0时,不再显示“want to chat with me?”和“you have x chances”,直接显示:“woohoo,let’s break up”(中文翻译为“呜呜呜,我们分手吧”),LED灯开始闪烁,每一秒钟 闪烁一次。5秒后程序重启。 发送1后,LED灯亮起,但是亮度为完全亮的一半亮度。OLED显示:“say please.....”此时可以向串口发送数字,通过数字来选择和女友聊天的内容。 发送1的话(聊天内容是天气如何),OLED显示:“what’s the weather like?”(估计显示不下,只要求必须显示关键词weather) 发送2的话(聊天内容是你喜欢我哪里),OLED显示:“what do you like about me?”(估计显示不下,只要求必须显示关键词like) 发送3的话(聊天内容是你曾经谈过几次恋爱),OLED显示:“how many times have you been in love?”(估计显示不下,只要求必须显示关键词in love ) 发送4的话(聊天内容是你有多爱我),OLED显示:“how many do you love me?”(估计显示不下,只要求必须显示关键词love me) 然后当你按下按键后,OLED下面显示倒计时“time = x”,x的值从9逐渐减 少,一直到0为止。在此过程中LED灯闪烁,并且闪烁速率逐渐加快。你必须在这10 秒内向串口发送你的答案, 如果没有time的值到0时,还没有发送完答案,那么LED灯将熄灭。并且OLED 显示:“woohoo,you do not love me”(中文翻译为“呜呜呜,你不爱我了”) 持续5秒OLED屏幕闪烁。然后,重新进入问问题阶段。但是LED灯的亮度明显变 暗。 如果及时发送了正确答案的话,那么LED灯将满亮。并且OLED显示:“I love you!!!”(此处不进行翻译)持续3秒OLED屏幕闪烁。然后,重新进入问问题阶 段。但是LED灯的亮度明显变亮。 LED灯的亮度有5个阶段,刚开始处于第3个阶段每一次成功答对问题,LED灯亮 度增加,第5阶段为满亮,第一阶段为熄灭。如果到了满亮或熄灭阶段,不必重新进 入问问题阶段。OLED屏幕闪烁完毕后,OLED显示:“let’s get married!!!”或 者“let’s break up now!!!”持续3秒后,程序重启。 (接下去,LED灯变成什么状态,就要执行相应的程序) 第一题的答案有:S(晴朗)、R(下雨)、W(多云)。回答任意一个即为正 确。 第二题的答案有:A(外貌)、S(灵魂)、L(都有)。只有回答L才是正确。 回答A或者SLED灯亮度减小一个阶段。 第三题的答案有:回答0是正确答案,1-3为半对答案,LED灯亮度减小一个阶 段,4以上LED灯直接熄灭。 第四题的答案有:回答10是正确答案,8或9为半对答案,LED灯亮度减小一个阶 段,6或7为半对答案,LED灯亮度减小两个阶段,6以下LED灯直接熄灭。 要求:在发完答案后,串口会把你的答案在屏幕上显示出来,格式为“your answer is xxx”  如果发送其他数字的话(选择除了1 2 3 4之外的题目),或者答案不在正确答案 范围里。说明你根本不了解你的女友,LED灯直接熄灭。             
06-01
计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略研究(Matlab代码实现)内容概要:本文研究了计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略,并提供了基于Matlab的代码实现。研究聚焦于在高渗透率可再生能源接入背景下,如何协调微电网内部分布式电源、储能系统与大规模电动汽车充电负荷之间的互动关系,通过引入需求侧响应机制,建立多目标优化调度模型,实现系统运行成本最小化、可再生能源消纳最大化以及电网负荷曲线的削峰填谷。文中详细阐述了风电出力不确定性处理、电动汽车集群充放电行为建模、电价型与激励型需求响应机制设计以及优化求解算法的应用。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、微电网、电动汽车等领域技术研发的工程师。; 使用场景及目标:①用于复现相关硕士论文研究成果,深入理解含高比例风电的微电网优化调度建模方法;②为开展电动汽车参与电网互动(V2G)、需求侧响应等课题提供仿真平台和技术参考;③适用于电力系统优化、能源互联网、综合能源系统等相关领域的教学与科研项目开发。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注模型构建逻辑与算法实现细节,同时可参考文档中提及的其他相关案例(如储能优化、负荷预测等),以拓宽研究视野并促进交叉创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值