`
QING____
  • 浏览: 2253292 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Atomic并发API简述

 
阅读更多

一.Atomic包,原子性。事实上,此包中的类可将volatile值、字段和数组元素的概念扩展到那些提供原子性操作的类上,主要方式为 compareAndSet(expectedValue,updateValue),

即CAS思想来确保内存一致性操作。expectedValue即当前值,updateValue为需要被更新的值,如果内存中的值为expectedVaue则更新,否则返回false。这些方法的实现基于处理器提供的高效机器级别原子性指令;由于平台的不同,cas的系统级别的底层实现,可能会基于锁,可能会阻塞线程。

 

除了包含表示单个值的类之外,此包还包含 Updater 类,该类可用于获取任意选定类的任意选定 volatile 字段上的 compareAndSet 操作。

 

AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater 和 AtomicLongFieldUpdater 是基于反射的实用工具,可以提供对关联字段类型的访问。它们主要用于原子数据结构中,该结构中同一节点(例如,树节点的链接)的几个 volatile 字段都独立受原子更新控制。这些类在如何以及何时使用原子更新方面具有更大的灵活性,但相应的弊端是基于映射的设置较为拙笨、使用不太方便,而且在保证方面也较差。

 

原子类也支持 weakCompareAndSet 方法,该方法具有受限制的适用性。在某些平台上,弱版本在正常情况下可能比 compareAndSet 更有效,但不同的是 weakCompareAndSet 方法的任何给定调用可能意外 返回 false(即没有明确的原因)。返回 false 仅意味着可以在需要时重新尝试操作,具体取决于重复执行调用的保证,当该变量保持 expectedValue 并且没有其他线程也在尝试设置该变量时,最终将获得成功。(例如,这样的虚假失败可能是由于内存争用的结果,该争用与期望值和当前值是否相等无关)。 此外,weakCompareAndSet 不提供通常需要同步控制的排序保证。但是,在这样的更新与程序的其他 happen-before 排序不相关时,该方法可用于更新计数器和统计数据。当一个线程看到对 weakCompareAndSet 导致的原子变量的更新时,它不一定能看到在 weakCompareAndSet 之前发生的对任何其他 变量的更新。例如,在更新性能统计数据时,这也许可以接受,但其他情况几乎不可以。

 

AtomicIntegerArray、AtomicLongArray 和 AtomicReferenceArray 类进一步扩展了原子操作,对这些类型的数组提供了支持。

这些类在为其数组元素提供 volatile 访问语义方面也引人注目,这对于普通数组来说是不受支持的。

 

Atomic的各种类,并没有统一的接口,他们却都具有几乎相同的操作方法。

AtomicBoolean,AtomicInteger,AtomicLong内部实现基本一致。以AtomicInteger为例,其底层为一个volatile int作为数据存储,并通过unsafe API的compareAndSwap方式尝试更新数据。

 

  • void set(newValue)/void lazySet(newValue):设置新值,采用非原子性操作,直接设置新值。lazySet主要是更新操作,并非立即执行,而是根据CPU调度(操作有序化),会在适当的时候被执行,比如在多核cpu中,此值不具有竞争性修改时,执行lazySet。。一种简单的non-blocking操作。
  • void getAndSet(newValue):通过cas方式设置新值,并返回修改之前的值。///

 

for (;;) {
	int current = get();
	if (compareAndSet(current, newValue))
		return current;
	}
}
 

 

  • final boolean compareAndSet(int expect, int update):CAS方式设置新值,设置成功返回true。底层使用unsafe.compareAndSwapInt(..)
  • final boolean weakCompareAndSet(int expect, int update):对于AtomicInteger/AtomicLong,AtomicBoolean/AtomicReference,此方法的实现和compareAndSet一模一样。所以此方法,可能再其他地方有不同的实现,再次不再赘言。

 

 

二.AtomicReference:原子性的更新对象引用。

 AtomicMarkableReference:此API设计的作用非常简单,原子性的更新对象引用以及其标记位(boolean属性),将一个对象引用和一个boolean属性捆绑,内部通过AtomicReference来实现。

 比如:AtomicMarkableReference(T reference,boolean initialMark),此构造函数则构建一个reference并使其具有initialMark的状态。

  • public V getReference():返回绑定的reference。
  • public boolean isMarked():返回标记为状态
  • public boolean compareAndSet(V expectedReference,V newReference,boolean expectedMark,boolean newMark):CAS方式更新reference和mark位,只有当reference和mark为都为期望值时,才更新为新值。
  • public void set(V newReference, boolean newMark) :强制设置新的reference和mark位。

 同样,AtomicStampedReference类和AtomicMarkableReference功能几乎完全一样,只不过AtomicStampedReference的“标志位”是一个int型,其API方法基本一样。AtomicStampedReference(V initialRef, int initialStamp):创建对象,使其初始引用和标记位为initialStamp。

 

三.AtomicReferenceFieldUpdater<T,V>

此类为抽象类,其提供了内置的实现方式。此类基于反射可以对指定类的指定 volatile 字段进行原子更新。

该类用于原子数据结构,该结构中同一节点的几个引用字段都独立受原子更新控制。我们之前看到的Atomic的类型API,只能对一种类型数据进行原子性操作。此类提供了可以针对一个class中多个volatile字段,

进行原子性更行的可能。不过AtomicReferenceFieldUpdater只能适用于类的一个属性。

 

class Node {
   private volatile Node left, right;
   private static final AtomicReferenceFieldUpdater leftUpdater =
   AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
   private static AtomicReferenceFieldUpdater rightUpdater =
   AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right");
   Node getLeft() { return left;  }
   boolean compareAndSetLeft(Node expect, Node update) {
     return leftUpdater.compareAndSet(this, expect, update);
   }
   // ... and so on
 }

 

  • public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass,Class<W> vclass,String fieldName):使用给定的字段为对象创建和返回一个更新器。需要 Class 参数检查反射类型和一般类型是否匹配。如果指定字段非volatile,将抛出异常。
  • boolean compareAndSet(T obj,V expect,V update):原子性的更新对象的属性值。
分享到:
评论

相关推荐

    Java并发编程最全面试题 123道

    20. 线程安全的类和方法:熟悉Java API中的一些线程安全类,如Atomic类、Collections.synchronizedXXX方法等。 六、Java内存模型 21. JMM(Java Memory Model):理解JMM如何保证多线程环境下的内存可见性和有序性...

    boost_atomic.7z

    `boost_atomic`库主要为开发者提供了一组跨平台的API,用于处理基本数据类型的原子操作。这些操作包括读取、写入、比较并交换(CAS)、增加和减少等,能够在多线程环境下保证操作的原子性,避免数据竞争和死锁的发生...

    java 并发编程的艺术pdf清晰完整版 源码

    6. **原子变量与并发工具类**:Java的并发包(java.util.concurrent.atomic)提供了原子变量,如AtomicInteger,它们能保证在并发环境下的原子性操作。此外,书中还会涵盖其他并发工具类,如Semaphore、...

    java并发编程与实践

    Java提供了一个强大的并发API,包括Thread类、Runnable接口以及ExecutorService和Future等工具类,使得开发者能够构建可扩展和高性能的应用。 该文档可能涵盖了以下几个关键知识点: 1. **线程基础**:解释了如何...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    Java并发API包括了线程、锁、同步、并发容器等丰富的工具,使得开发者可以构建能够充分利用多核处理器性能的应用程序。本书详细介绍了这些主题,并提供了实例代码和实践建议。 首先,书中详细讨论了Java线程的创建...

    PyPI 官网下载 | atomic-queue-1.0.1.tar.gz

    atomic-queue库的API设计简洁明了,通常包含初始化队列、入队(enqueue)、出队(dequeue)等基本操作。在开发中,开发者可以利用这些接口轻松地构建并发友好的代码。例如,一个简单的使用示例可能是创建一个线程...

    探秘Java并发:Atomic&amp;Unsafe的强大魔法

    本文深入解析Java并发编程中的两个关键类:Atomic和Unsafe。这些类在提高Java并发操作的效率和安全性方面扮演着至关重要的角色。原子操作的核心:原子操作是不可分割的操作单元,确保数据的一致性和完整性。Java通过...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    Java平台提供了丰富的并发工具和API,如线程、同步机制、并发容器、并发工具类等,这些在《Java 并发编程实战》中都有详尽的阐述。 1. **线程与进程**:书中首先会介绍操作系统中的线程和进程概念,以及它们在Java...

    Java并发编程设计原则与模式.pdf

    2. **Java并发API**:Java提供了丰富的并发API,如`java.util.concurrent`包下的Thread、ExecutorService、Semaphore、CountDownLatch、CyclicBarrier、ThreadPoolExecutor等类,这些都是并发编程中的重要工具。...

    并发编程atomic&collections-课上笔记1

    并发编程 atomic & collections - 课上笔记1 本文主要讲述了 Java 中的并发编程,包括 atomic 包的介绍、CAS 算法的原理、ABA 问题的解决方案,以及 collections 中的 HashMap、HashTable 和 ConcurrentHashMap 的...

    Java并发编程:设计原则与模式(第二版).rar

    2. **Java并发API**:Java提供了丰富的并发API,如`Thread`、`Runnable`、`ExecutorService`和`Future`等。这些API是Java并发编程的核心,书中会详细解析它们的使用方法和应用场景。 3. **线程安全**:线程安全是...

    JAVA并发编程实践

    2. **Java并发API**:书中详细讲解了Java并发库中的核心组件,如`ExecutorService`、`Future`、`Callable`、`Runnable`接口,以及`Semaphore`、`CountDownLatch`、`CyclicBarrier`等同步工具类。这些工具能帮助...

    Java并发编程实践高清pdf及源码

    Java平台提供了丰富的API来支持并发,如`Thread`类、`ExecutorService`接口和`Future`接口等。这些工具允许开发者设计出能够充分利用多核处理器性能的高效程序。 书中详细讲解了以下关键知识点: 1. **线程安全**...

    volatile,nonatomic和atomic关键字测试

    在iOS和Mac开发中,Objective-C是主要的编程语言,它在定义实例变量或属性时提供了几个关键的修饰符,包括`volatile`、`nonatomic`和`atomic`。这些关键字对于理解多线程环境下的数据同步和内存管理至关重要。本文将...

    实战Java高并发程序设计-试读

    此外,可能会讨论到原子变量类(Atomic*),如AtomicInteger、AtomicBoolean等,它们提供了无锁的原子操作,是实现高效并发编程的重要工具。还有volatile关键字,用于确保多线程环境下的可见性和有序性,防止指令重...

    Java并发编程与高并发解决方案(高清视频教程).rar

    Java并发API,如java.util.concurrent包,包含了许多高级并发工具,例如ExecutorService、Future、Callable、Semaphore、CyclicBarrier和CountDownLatch等。ExecutorService允许我们管理线程池,而Future和Callable...

    java并发编程

    Java并发API的核心组件包括: 1. **ExecutorService**: 这是线程池的接口,通过它可以管理和控制线程的执行。`Executors`类提供了一些工厂方法来创建不同类型的线程池,如固定大小的线程池、单线程的Executor等。 ...

    java并发实战中文文档

    Java平台提供了丰富的并发工具和API,如线程、锁、同步机制、并发集合以及执行器服务等,这些工具和API都在本书中有详尽的介绍。 1. **线程基础**:Java中的线程是并发执行的基本单位。文档会讲解如何创建和管理...

    实战Java高并发程序设计模式

    Java提供了丰富的并发API,如Thread类、Runnable接口和ExecutorService,用于创建和管理线程。 2. 线程安全:在多线程环境下,线程安全指的是对象的状态在被多个线程访问时仍然能保持正确。Java中,线程安全的实现...

Global site tag (gtag.js) - Google Analytics