zoukankan      html  css  js  c++  java
  • 【并发编程】-01-可见性、原子性、有序性

    01-可见性、原子性、有序性

    源头之一:缓存导致的可见性问题

    可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到,我们称为可见性.

    源头之二:线程切换带来的原子性问题

    例如:count += 1,在cpu指令级别上

    • 指令 1:首先,需要把变量 count 从内存加载到 CPU 的寄存器;
    • 指令 2:之后,在寄存器中执行 +1 操作;
    • 指令 3:最后,将结果写入内存(缓存机制导致可能写入的是 CPU 缓存而不是内存)。

    我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。CPU 能保证的原子操作是 CPU 指令级别的,而不是高级语言的操作符。

    源头之三:编译优化带来的有序性问题

    经典的例子:

    
    public class Singleton {
      static Singleton instance;
      static Singleton getInstance(){
        if (instance == null) {
          synchronized(Singleton.class) {
            if (instance == null)
              instance = new Singleton();
            }
        }
        return instance;
      }
    }
    

    出现的问题:new 操作上,:

    • 分配一块内存 M;
    • 在内存 M 上初始化 Singleton 对象;
    • 然后 M 的地址赋值给 instance 变量。

    但是实际上优化后的执行路径却是这样的:

    • 分配一块内存 M;
    • 将 M 的地址赋值给 instance 变量;
    • 最后在内存 M 上初始化 Singleton 对象。

    不要小瞧女程序员
  • 相关阅读:
    一行code实现ADO.NET查询结果映射至实体对象。
    傻瓜式使用AutoFac
    Asp.Net MVC中捕捉错误路由并设置默认Not Found页面。
    asp.net MVC中实现调取web api
    JavaScript_11_验证
    JavaScript_10_错误
    JavaScript_9_循环
    JavaScript_8_比较,条件语句
    JavaScript_7_运算符
    JavaScript_6_函数
  • 原文地址:https://www.cnblogs.com/shix0909/p/15072395.html
Copyright © 2011-2022 走看看