zoukankan      html  css  js  c++  java
  • 多线程实现原理

    JMM保证原子性、可见性、有序性

    原子性

    两个高级的字节码指令monitorenter和monitorexit,在java中对应的Synchronized来保证代码块内的操作是原子的

    可见性

    • volatile

      写操作的时候会多出一个lock前缀的汇编指令

      MESI的缓存一致性协议,来保证多CPU下的各个高速缓存中的数据的
      一致性

    • synchronized和final也可以实现可见性

    有序性

    • volatile(禁止指令重排)

      遵循as-if-serial语义

    • synchronized(同一时刻只允许一条线程操作)

    内存屏障

    通过下面三种方式的作用:

    • 防止指令之间的重排序
    • 保证数据的可见性
    • 写屏障(store barrier)
      • storestore barrier
      • 强制所有在storestore内存屏障之前的所有执行,都要在该内存屏障之前执行,并发送缓存失效的信号

    ![](https://img2018.cnblogs.com/blog/1841773/201910/1841773-20191029212018380-1297817439.png)

    • 读屏障(load barrier)
      • loadload barrier
      • 强制所有在load barrier读屏障之后的load指令,都在loadbarrier屏障之后执行

    ![](https://img2018.cnblogs.com/blog/1841773/201910/1841773-20191029212050151-61554426.png)

    • 全屏障(Full Barrier)
      • 相当于storeload,是一个全能型的屏障
      • 强制了所有在storeload barrier之前的store/load指令,都在该屏障之前被执行,所有在该屏障之后的的store/load指令,都在该屏障之后被执行
      • 禁止对storeload屏障前后的指令进行重排序

    ![](https://img2018.cnblogs.com/blog/1841773/201910/1841773-20191029212120025-947512465.png)

    volatile为什么不能保证原子性

    通过javap -c Demo.class,去查看字节码

    对一个原子递增的操作,会分为三个步骤:

    1.读取volatile变量的值到local;

    2.增加变量的值;

    3.把local的值写回让其他线程可见。

  • 相关阅读:
    js获取多选框选择的值并拼接成字符串
    把不可枚举数组转换成可枚举数组
    js对接图片上传接口
    填数字游戏解题机
    带你深入了解nginx基本登录认证(包含配置步骤)
    高三whk回忆录
    SpringBoot异步任务
    Shell 脚本
    【Ubuntu】知识点及经验
    【Ubuntu】 安装相关
  • 原文地址:https://www.cnblogs.com/snail-gao/p/11761656.html
Copyright © 2011-2022 走看看