天天看点

原子操作

定义:一个操作是原子的(atomic),如果这个操作所处的层(layer)的更高层不能发现其内部实现与结构。

     1、原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。 

视作整体式原子性的核心。

        2、在多进程(线程)访问资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。原子操作(atomic operation)是不需要synchronized,这是java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何

context switch (切换到另一个线程)。通常所说的原子操作包括对非long和double型的primitive进行赋值,以及返回这两者之外的primitive。之所以要把它们排除在外是因为它们都比较大,而jvm的设计规范又没有要求读操作和赋值操作必须是原子操作(jvm可以试着去这么作,但并不保证)。

        3、primitive主数据类型。java等编程语言中的默认基本数据类型,如:int,long等。

--百度百科

        java.util.concurrent.atomic 包中提供了以下原子类, 它们线程安全,并非通过同步和锁来实现的。

atomicboolean -- 原子布尔

atomicinteger -- 原子整型

atomicintegerarray -- 原子整型数组

atomicintegerfieldupdater -- 用来包裹对整形 volatile 域的原子操作 

atomiclong -- 原子长整型

atomiclongarray -- 原子长整型数组

atomiclongfieldupdater -- 用来包裹对长整型 volatile 域的原子操作 

atomicmarkablereference -- 原子标记引用 

atomicreference -- 原子引用

atomicreferencearray -- 原子引用数组

atomicreferencefieldupdater -- 用来包裹对对象 volatile 域的原子操作 

atomicstampedreference -- 原子戳记引用

doubleaccumulator    @since 1.8

doubleadder    @since 1.8

longaccumulator    @since 1.8

longadder    @since 1.8

        引入这些类是为了实现一种所谓的无锁定且无等待算法,如: 比较并交换 (cas), 它的原理是比较当前值与期望值, 如果相同则表示该变量没有发生变化。