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


相关推荐

  • MATLAB对Googlenet模型进行迁移学习

    MATLAB对Googlenet模型进行迁移学习调用MATLAB中的Googlenet工具箱进行迁移学习。%%加载数据clc;closeall;clear;Location=”;%这里输入自己的数据集unzip(‘MerchData.zip’);imds=imageDatastore(‘MerchData’,…%若使用自己的数据集则改为Location(不加单引号)…

    2022年8月14日
    5
  • 认识ManualResetEvent

    认识ManualResetEventManualResetEvent可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可以访问资源。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始执行)时

    2022年7月4日
    27
  • mysql secure file priv(private)

    1290–TheMySQLserverisrunningwiththe–secure-file-privoptionsoitcannotexecutethisstatementsecure-file-priv特性secure-file-priv参数是用来限制LOADDATA,SELECT…OUTFILE,andLOAD_FILE()传到哪个指定…

    2022年4月15日
    43
  • 深入理解卷积层,全连接层的作用意义「建议收藏」

    深入理解卷积层,全连接层的作用意义「建议收藏」有部分内容是转载的知乎的,如有侵权,请告知,删除便是,但由于是总结的,所以不一一列出原作者是who。再次感谢,也希望给其他小白受益。首先说明:可以不用全连接层的。理解1:卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。因为用到了所有的局部特征,所以叫全连接。理解2:从卷积网络谈起,卷积网络在形式上有一点点像咱们正在召开的“人民代表大会制度”。卷积核的个数相当于候选人,…

    2022年9月19日
    4
  • STM32驱动ST7701S芯片(vⅰV0手机换屏价)

    1、配置GPIO口voidLCD_GPIO_Config(void){/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDefGPIO_InitStructure;/*????IO??*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE…

    2022年4月11日
    360
  • 史上最全的中高级JAVA工程师-面试题汇总

    史上最全的中高级JAVA工程师-面试题汇总史上最全的java工程师面试题汇总,纯个人总结,精准无误。适合中高级JAVA工程师。

    2022年6月13日
    30

发表回复

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

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