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不能保证原子性

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • break 与continue语句的区别_return用法

    break 与continue语句的区别_return用法来源:http://blog.csdn.net/u014612521/article/details/42720987break可以离开当前switch、for、while、dowhile的程序块,并前进至程序块后下一条语句,在switch中主要用来中断下一个case的比较。在for、while与dowhile中,主要用于中断目前的循环执行。continue的作用与

  • @helper的使用

    @helper的使用、前言最近翻到一篇Scott的旧文,觉得挺不错的,就试着翻译了一下,文章主要是说如何在Razor中使用@helper语法定义可复用的视图模板方法。如有疏漏,还请请各位看官指点一二~原文地址:http:

  • UpdatePanel用法详解

    UpdatePanel用法详解本文转自:http://www.cnblogs.com/shangxia/articles/2281782.html今天用做日历显示本月的考勤记录,用到了UpdatePanel控件,才发现对这个控件并不太了解,所以找了点儿资料,整理了一下给大家发上来!一、UpdatePanel的结构”ScriptManager1″runat=”server”>”Update

  • ❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】

    ❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】文章目录操作系统的发展史UnixMinixLinux操作系统的发展Minix没有火起来的原因Linux介绍Linux内核&发行版Linux内核版本Linux发行版本类Unix系统目录结构Linux目录用户目录命令行基本操作命令使用方法查看帮助文档helpman(manual)tab键自动补全history游览历史命令行中的ctrl组合键Linux命令权限管理列出目录的内容:ls显示inode的内容:stat文件访问权限修改文件权限:chmod修改文件所有者:chown修改文件所属组:chgrp文件.

  • 计算机445 135 139端口,Win7如何关闭445 135 138 139端口[通俗易懂]

    计算机445 135 139端口,Win7如何关闭445 135 138 139端口[通俗易懂]5月12日全球爆发勒索病毒,国内外很多行业已遭受勒索病毒的侵害,勒索病毒迅速传播,目前已知传播途径基本都是通过445135137138139端口进行传播,那么只要关闭这些端口即可起到很好的预防作用,本文将介绍Win7怎么关闭445135137138139端口的方法。关闭445135137138139端口方法教程:1、打开Windows徽标(开始菜单),点击“控制面板”;2、…

    2022年10月10日
  • 【转载】在VS2008中使用WSE 3.0过程全记录

    【转载】在VS2008中使用WSE 3.0过程全记录

    2021年11月18日

发表回复

您的电子邮箱地址不会被公开。

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