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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 教你如何找回被盗的QQ密码(转贴)

    教你如何找回被盗的QQ密码(转贴)   目前QQ木马品种繁多,功能强大,且易学易用,连初学者也会用!正因为这样,QQ木马才那么容易泛滥成灾,现在的网吧,学校机房……30%都可能被人装上了木马,况且大家的防盗意识不高,QQ被盗已是常见事。当QQ被盗了,怎么才可以要回呢?!这是我在网上回答网友N遍的问题了,现在总结一下供大家参考:要想要回QQ有必要了解下QQ是怎么被盗的,“小黑客们” 常用以下几种盗取QQ:(1)装木马程序。QQ被盗

    2022年7月20日
    14
  • Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?

    Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?最近在研究Activity的启动流程,老罗的blog在看,也找了其它资料学习,也跟过Android4.3的源码,在跟代码的过程中,突然想到下面的这个问题:  AndroidActivity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?网上太多根据Android开发规范翻译转载的内容,都不是我想要的答案,那就自己分析下

    2022年5月5日
    33
  • Centos7安装arpspoof

    Centos7安装arpspoofLinux安装arpspoof进行arp攻击实验注:仅可用于学习arp原理及攻击防护,切勿用于非法用途!!!环境:centos7一.下面是需要的所有依赖包,yum源都有,只有dsniff和libnids需要另外下载,直接yum安装就可以:yum-yinstalllibICElibSMlibXmulibpcaplibnetlibXextlibXext-develli…

    2022年10月7日
    0
  • PIP 更换国内安装源「建议收藏」

    PIP 更换国内安装源「建议收藏」pip国内的一些镜像  阿里云http://mirrors.aliyun.com/pypi/simple/  中国科技大学https://pypi.mirrors.ustc.edu.cn/simple/  豆瓣(douban)http://pypi.douban.com/simple/  清华大学https://pypi.tuna.tsinghua.edu.cn/simpl…

    2022年6月4日
    25
  • Eclipse快捷键大全

    Eclipse快捷键大全

    2021年5月24日
    205
  • python的取余算法原理_python.取余算法

    python的取余算法原理_python.取余算法#-*-coding:utf-8-*-”’Createdon2012-12-28取余。取一个任意小于1美元的金额,然后计算可以换成最少多少枚硬币。硬币有1美分,5美分,10美分,25美分四种。1美元等于100美分。举例来说,0.76美元换算结果应该是3枚25美分,1枚1美分。类似76枚1美分,2枚25美分+2枚10美分+1枚5美分+1枚1美分这样的…

    2022年4月25日
    43

发表回复

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

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