Voliate

Voliate1、voliate的理论作用:A、保证可见性B、保证指令不重新排2、可见性原理:a.保证写后的数据马上回写到系统内存b。根据缓存一致性协议,保证写后,数据在总线声明为过期,其他已经读取过这个变量的处理器会通过嗅探技术,发现自己的数据内存被修改,声明无效,如果要修改,则会重新去读取,但是,如果不修改,则不会去读取c.不能保证原子性代码:while(i==1){i++;}…

大家好,又见面了,我是你们的朋友全栈君。

1、voliate的理论作用:
A、保证可见性
B、保证指令不重新排

2、可见性原理:
a.保证写后的数据马上回写到系统内存
b。根据缓存一致性协议,保证写后,数据在总线声明为过期,其他线程需要读取这个变量时,理器会通过嗅探技术,发现自己的数据内存被修改,声明无效,会再次读取主内存的值
c.不能保证原子性
代码:
while(i==1){

: i++;
}

i++,应该看成两个原子操作,1、读i 2、写i加一

线程1:执行i++,先读i,因为还没变,所以读取到的是1,暂停。thread2此时也开始执行,i++,并且读,写全部完成,将2写入主内存。此时,线程1因为已经执行了读操作,继续写操作,因为读到的数据是旧数据,还是变成2.本来应该变成3

说明:上面的说法有点模糊,其实很简单,voliate只是保障在读操作时,能通知到你thread1,变量i是否最新,如果最新,则自己内存读取,如果不是则去主内存读取。上面的举例是一个很典型的并发导致的问题。

即使我们将i声明为voliate,线程2保存的缓存依然还是1,它只能保证读时最新的数据,但不能保证写时,数据最新

3、指令重排原理:
指令优化:互不依赖的指令会进行重排,优化计算
线程1:
context= new init();
isInit = ture;
线程2:
while(isInit ){

: context.dosomething();
}

线程1在开始时,可以进行指令重排,当先执行isinit=true后,线程2while循环发现条件已经达到,执行context,因此事context还没有初始化,抛错。将isinit设置为voliate变量即可,该变量,会告诉计算机,线程1的代码,在isintint前的代码一定先于isinit 执行,保证context先执行。

4、voliate的使用场景:
a.单例模式的双重检验
public class single(){

private voiliate single instance;
private get(){

if(instance == null){

sycronized(single.class){

if(instance == null){

instance = new single();
}
}
}
}
}

将instance声明为voliate,可以在instance 实例化的第一时间回写到系统内存,防止线程1执行完同步代码块后,没有及时回写instance,导致线程2判断instance==null时,读取的数据还是旧的数据

b.状态标记:
while(isShutDown){

dosomething;
}
每次读取的数据,都是最新的,但是,dosomething里面不应该涉及到voliate变量的写,因为voliate不能保证原子性

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130397.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • mybatis mysql 分页sql语句_使用mybatis分页查询并统计总数「建议收藏」

    mybatis mysql 分页sql语句_使用mybatis分页查询并统计总数「建议收藏」今天在优化项目的时候,偶尔发现了一种分页查询的方法。其目的是,在分页查询的同时查出数据总记录数并实现模糊查询功能。并且,在以往的分页查询上,如果要使用模糊查询,则模糊查询出来的总记录数可能出现问题。使用改方法可以优化代码。本项目使用的是springboot,mybatis,druid连接池以下贴上源码:mybatis的xml文件①resultMap=”trainResultMap,count”注…

    2022年6月2日
  • 精进 Quartz—Quartz大致介绍(一)

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统,“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。

    2022年2月25日
  • idea 2021 mac 激活码【2021免费激活】[通俗易懂]

    (idea 2021 mac 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsaWNlbnNlSWQi…

    2022年3月25日
  • Android滑动解锁功能实现,Android_滑动解锁

    Android滑动解锁功能实现,Android_滑动解锁1.滑动解锁代码流程图:流程图图片资源:https://pan.baidu.com/s/1tkcw0tdxV78mnwHqOtcAGg提取码:2xsq2.代码:xml文件:xmlns:app=”http://schemas.android.com/apk/res-auto”xmlns:tools=”http://schemas.android.com/tools”android:layout_wi…

    2022年6月29日
  • FinalShell简单的使用

    FinalShell简单的使用今天真的是很丧的一天,早上来到公司写了一会代码,需要用xshell时发现,以前都能打开的xshell突然出问题了。如下截图…于是想着重启看看。我的天,重启之后,网卡没了,接着就是死活连不上网,不管设置什么都连接不上网,驱动也装不上去,反正就是十八般武艺全用上了(博主可能比较菜),都没作用,于是请人,反正弄了半天,给我放个大招,重装系统 。重装系统肯定就好了,可是环境都没了,开始一点…

    2022年6月13日
  • FPGA与CPLD的比较[通俗易懂]

    FPGA与CPLD的比较[通俗易懂]FPGA基于SRAM的架构,集成度高,以Slice为基本单元,有内嵌Memory、DSP等,支持丰富的IO标准,具有易挥发性,需要有上电加载过程。在实现复杂算法、队列调度、数据处理、高性能设计、大容量缓存设计等领域有广泛应用,如XilinxVirtex系列以及AlteraStratix系列。CPLD基于EEPROM工艺,集成度低,以MicroCell为基本单元。具有非挥发特性,可以重复写入。在粘合逻辑、地址译码、简单控制、FPGA加载等设计中有广泛应用,如XilinxCoolRunner系列以及Al

    2022年6月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号