zoukankan      html  css  js  c++  java
  • JUC-原子操作类

    volatile无法保证原子性,原子类操作出现,无法保证原子性的原因上篇有说。

    以i++举例

    内存图如下,

    1.普通情况下,由于i++存在读写改三步操作,必然出现并发异常

      1.sn=0

      2.T1->sn=0+1

      2.T2->sn=0+1

      3.sn=1

      3.sn=1

      期待值->2

      实际值->1

     2.volatile修饰

      相当于T1,T2全部从主存中进行读写改操作,由于不在同一个线程,此时也会出现

      1.sn=0

      2.T1->sn=0+1

      2.T2->sn=0+1

      3.sn=1

      3.sn=1

      期待值->2

      实际值->1

    3.使用原子类(使用volatile保证内存可见性,CAS实现原子性)

    CAS(Compare-And-Swap)包含三个操作数

      1.内存值 A  

      2.预估值 B

      3.更新值 C

      当且仅当A==B时候,A=C,否则不做操作

       T1:

        A->0

        B->0

        C->1

      T2:

        A->0

        B->1

        C->1

    T1先改后,T2,A!=B,不做任何操作,保证原子性

  • 相关阅读:
    基于Token的WEB后台认证机制
    导出和导入Docker容器
    进入Docker容器
    介绍Docker容器
    Docker镜像的实现原理
    Docker 移除镜像
    存出和载入Docker镜像
    Docker 创建镜像
    Docker 列出镜像
    Docker如何获取镜像
  • 原文地址:https://www.cnblogs.com/xyzxy/p/14293578.html
Copyright © 2011-2022 走看看