zoukankan      html  css  js  c++  java
  • volatile关键字

    1.  计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,会涉及到数据的读取和写入,但由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。

       也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。这样的操作在单线程中不会出现什么问题,但是在多线程中运行就可能会出现问题,会出现缓存不一致问题。

    2.  解决缓存不一致的问题有:通过在总线加LOCK#锁的方式或者通过缓存一致性协议(硬件层次上的方法)。

    3.  volatile关键字的两层语义

       一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

       1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

       2)禁止进行指令重排序。

       它能保证程序的可见性,一定程度的有序性,但是不能保证原子性(可以采用synchronized)。

    4.  使用volatile必须具备以下2个条件:

       1)对变量的写操作不依赖于当前值

       2)该变量没有包含在具有其他变量的不变式中

       具体更细致的可以看链接:https://www.cnblogs.com/dolphin0520/p/3920373.html

  • 相关阅读:
    Vue 路由的编程式导航与history模式
    Vue 路由配置、动态路由
    Vue 组件传值
    Vue 组件以及生命周期函数
    Vue 封装js
    记一次proc_open没有开启心得感悟
    面向内容的标记语言--markdonw
    浅谈索引
    mysql主从配置
    centos7下操作防火墙
  • 原文地址:https://www.cnblogs.com/jkzr/p/10576268.html
Copyright © 2011-2022 走看看