zoukankan      html  css  js  c++  java
  • java内存模型的原子性、可见性、有序性与指令重排序

    在并发编程中,我们通常会遇到以下三个概念:原子性、可见性和有序性。我们先看具体看一下这三个概念:

    1.原子性

    操作时不可分割的
    比如a=0,此操作不可分割,而++a,实际上是a=a+1,为两个操作。想将非原子操作编程原子操作,得用synchronized、lock等修饰
    volatile修饰的变量不具备原子性。

    2.可见性

    即当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    比如用volatile修饰的变量,线程A修改后立即写入主存,线程B中的变量的缓存行失效,只能从主存中获取。

    3.有序性

    即程序执行的顺序按照代码的先后顺序执行。

    指令重排序(Instruction reorder)

    处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。

    处理器在进行重排序时是会考虑指令之间的数据依赖性,如果一个指令Instruction 2必须用到Instruction 1的结果,那么处理器会保证Instruction 1会在Instruction 2之前执行。

  • 相关阅读:
    python学习之第二课时--运行程序和字符编码
    python学习之前言
    一天一道算法题--6.14--思维题
    TOJ--2119--最小生成树和map
    NOJ--1046--dfs
    TOJ--1343--dfs
    一天一道算法题--6.13---计算几何
    一天一道算法题---6.12---链表结点的删除
    TOJ--1114--rmq/线段树
    TOJ--1278--最小生成树
  • 原文地址:https://www.cnblogs.com/yanze/p/9835462.html
Copyright © 2011-2022 走看看