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


相关推荐

  • linux history命令常用方法

    linux history命令常用方法c清空内存中命令历史-d#删除指定的历史命令,比如history-d100,就是删除第100个命令历史history+nn代表行例如history500查看最近500行命令历史记录

    2022年7月16日
    17
  • 在pycharm中安装opencv_pycharm opencv

    在pycharm中安装opencv_pycharm opencv打开pycharm下方的terminal终端在路径下直接输入pipinstallopencv-python稍等片刻既安装成功在这里查看项目安装的模块点击左上方文件-设置-项目-Protect-Interpreter看到我们已经安装了opencv-python与numpy模块…

    2022年8月27日
    3
  • [leetcode] Combination Sum and Combination SumII

    [leetcode] Combination Sum and Combination SumII

    2022年1月11日
    41
  • Razor语法_range语法

    Razor语法_range语法本章通过示例来说明常见用途下的Razor语法。1.Razor中的核心转换符号是@。这个单一字符用做标记-代码的转换字符,有时也反过来用作代码-标记的转换字符。这里共有两种基本类型的转换:代码表达式和代码块。求出表达式的值,然后将值写入到响应中。@{stringrootNamespace="MyApp";}<span>@rootNamespace.Models&…

    2025年7月26日
    0
  • dispatch_once认识分析

    dispatch_once认识分析

    2022年1月5日
    42
  • Kali linux新手入门视频教程|Kali linux安装

    Kali linux新手入门视频教程|Kali linux安装一、 Kalilinux是什么?KaliLinux是基于Debian的Linux发行版,设计用于数字取证操作系统。KaliLinux面向专业的渗透测试和安全审计.因此,KaliLinux已经进行了如下的多处核心的修改。单用户,设计成root权限登录:由于安全审计的本质,KaliLinux被设计成使用”单用户,root权限“方案。二、 Kalilinux新手入门教程目录(视频教程)…

    2022年5月26日
    60

发表回复

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

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