zoukankan      html  css  js  c++  java
  • 高效并发高级-黄金

    多线程执行内存模型和特点

    • 原子性:指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作一旦开始不会被其他线程干扰
    • 有序性:在并发时,程序的执行可能会出现乱序

    为什么会出现乱序?

    • 一条指令的执行是可以分为很多步骤的,每个步骤是又CPU不同的部件执行,每条指令都对应如下这五个步骤
    1. 取指 IF
    2. 译码和取寄存器操作数 ID
    3. 执行或者有效地址计算 EX
    4. 存储器访问 MEM
    5. 写回 WB
    •  如A=B+C;这里其实是3个指令
    • 读B,读C,B+C,赋值,那么他的执行顺序在CPU中其实是这样的

    • 图中的X是因为第二排指令还没有到MEM,所以没办法获取到C的值,就没办法计算,所以就先空出来,CUP对对这些指令进行进一步的优化,使得所有X都会被填充,这个过程称之为指令重排,正式因为这个原因,使得在并发时,程序的执行可能会出现乱序。
    • 可见性:可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改
    • 编译器优化

     硬件优化(如写吸收,批操作)

     

    • Hapepen-Before规则
    1. 程序顺序原则:一个线程内保证语义的串行性,在代码层面上是按照顺序执行的
    2. volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
    3. 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
    4. 传递性:A先于B,B先于C,那么A必然先于C
    5. 线程的start()方法先于它的每一个动作
    6. 线程的所有操作先于线程的终结(Thread.join())
    7. 线程的中断(interrupt())先于被中断线程的代码
    8. 对象的构造函数执行结束先于finalize()方法
    • 对于volatile变量的特殊规则
    1. 第一是保证了此变量对所有线程的可见性,这里的可见性是指当一条线程修改了这个变量的值,新值对于其他线程来说是立即知道的,而普通变量不能做到这一点,如果使用volatile变量来控制并发,必须满足运算结果不依赖于变量的当前值,或者能够确保只有单一的现场修改变量的值。变量不需要与其他状态变量共同参与不变约束
    2. 第二是禁止指令重排序优化

      了解完特点之后,我们下一段来到好玩的知识,也是比较有意思的阶段

  • 相关阅读:
    oracle维护表空间和数据文件
    IOS 应用的架构解析
    html5之拖放简单效果
    跟Google学习Android开发-起始篇-与其它应用程序交互(1)
    淘宝服务市场 淘宝订单同步方案
    论文阅读笔记
    页面爬虫(获取其他页面HTML)加载到自己页面
    由href return false 来看阻止默认事件
    Delete it
    Mac上利用Eclipse编译Cocos2d-x
  • 原文地址:https://www.cnblogs.com/zhuoqingsen/p/8647498.html
Copyright © 2011-2022 走看看