Atomic api copy 记录
来源:互联网 发布:java做的图书管理系统 编辑:程序博客网 时间:2024/05/16 16:02
软件包 java.util.concurrent.atomic
类的小工具包,支持在单个变量上解除锁的线程安全编程。
软件包 java.util.concurrent.atomic 的描述
类的小工具包,支持在单个变量上解除锁的线程安全编程。事实上,此包中的类可将 volatile 值、字段和数组元素的概念扩展到那些也提供原子条件更新操作的类,其形式如下:
boolean compareAndSet(expectedValue, updateValue);
如果此方法(在不同的类间参数类型也不同)当前保持 expectedValue,则以原子方式将变量设置为 updateValue,并在成功时报告true。此包中的类还包含获取并无条件设置值的方法,以及以下描述的较弱条件的原子更新操作 weakCompareAndSet。
这些方法的规范使实现能够使用当代处理器上提供的高效机器级别原子指令。但是在某些平台上,该支持可能需要某种形式的内部锁。因而,该方法不能严格保证不被阻塞 - 执行操作之前可能暂时阻塞线程。
类 AtomicBoolean
、AtomicInteger
、AtomicLong
和 AtomicReference
的实例各自提供对相应类型单个变量的访问和更新。每个类也为该类型提供适当的实用工具方法。例如,类AtomicLong 和 AtomicInteger 提供了原子增量方法。一个应用程序将按以下方式生成序列号:
class Sequencer { private final AtomicLong sequenceNumber = new AtomicLong(0); public long next() { return sequenceNumber.getAndIncrement(); }}
原子访问和更新的内存效果一般遵循以下可变规则,正如 The Java Language Specification, Third Edition (17.4 Memory Model) 中的声明:
- get 具有读取 volatile 变量的内存效果。
- set 具有写入(分配)volatile 变量的内存效果。
- 除了允许使用后续(但不是以前的)内存操作,其自身不施加带有普通的非 volatile 写入的重新排序约束,lazySet 具有写入(分配)volatile 变量的内存效果。在其他使用上下文中,当为 null 时(为了垃圾回收),lazySet 可以应用不会再次访问的引用。
- weakCompareAndSet 以原子方式读取和有条件地写入变量但不 创建任何 happen-before 排序,因此不提供与除weakCompareAndSet 目标外任何变量以前或后续读取或写入操作有关的任何保证。
- compareAndSet 和所有其他的读取和更新操作(如 getAndIncrement)都有读取和写入 volatile 变量的内存效果。
除了包含表示单个值的类之外,此包还包含 Updater 类,该类可用于获取任意选定类的任意选定 volatile 字段上的compareAndSet 操作。AtomicReferenceFieldUpdater
、AtomicIntegerFieldUpdater
和AtomicLongFieldUpdater
是基于反射的实用工具,可以提供对关联字段类型的访问。它们主要用于原子数据结构中,该结构中同一节点(例如,树节点的链接)的几个volatile 字段都独立受原子更新控制。这些类在如何以及何时使用原子更新方面具有更大的灵活性,但相应的弊端是基于映射的设置较为拙笨、使用不太方便,而且在保证方面也较差。
AtomicIntegerArray
、AtomicLongArray
和AtomicReferenceArray
类进一步扩展了原子操作,对这些类型的数组提供了支持。这些类在为其数组元素提供volatile 访问语义方面也引人注目,这对于普通数组来说是不受支持的。
原子类也支持 weakCompareAndSet 方法,该方法具有受限制的适用性。在某些平台上,弱版本在正常情况下可能比compareAndSet 更有效,但不同的是 weakCompareAndSet 方法的任何给定调用可能意外 返回false(即没有明确的原因)。返回 false 仅意味着可以在需要时重新尝试操作,具体取决于重复执行调用的保证,当该变量保持expectedValue 并且没有其他线程也在尝试设置该变量时,最终将获得成功。(例如,这样的虚假失败可能是由于内存争用的结果,该争用与期望值和当前值是否相等无关)。 此外,weakCompareAndSet 不提供通常需要同步控制的排序保证。但是,在这样的更新与程序的其他 happen-before 排序不相关时,该方法可用于更新计数器和统计数据。当一个线程看到对weakCompareAndSet 导致的原子变量的更新时,它不一定能看到在 weakCompareAndSet 之前发生的对任何其他 变量的更新。例如,在更新性能统计数据时,这也许可以接受,但其他情况几乎不可以。
AtomicMarkableReference
类将单个布尔值与引用关联起来。例如,可以在数据结构内部使用此位,这意味着引用的对象在逻辑上已被删除。AtomicStampedReference
类将整数值与引用关联起来。例如,这可用于表示与更新系列对应的版本号。
设计原子类主要用作各种构造块,用于实现非阻塞数据结构和相关的基础结构类。compareAndSet 方法不是锁的常规替换方法。仅当对象的重要更新限定于单个 变量时才应用它。
原子类不是 java.lang.Integer 和相关类的通用替换方法。它们不 定义诸如 hashCode 和compareTo 之类的方法。(因为原子变量是可变的,所以对于哈希表键来说,它们不是好的选择。)另外,仅为那些通常在预期应用程序中使用的类型提供类。例如,没有表示byte 的原子类。这种情况不常见,如果要这样做,可以使用 AtomicInteger 来保持 byte 值,并进行适当的强制转换。也可以使用Float.floatToIntBits 和 Float.intBitstoFloat 转换来保持 float 值,使用 Double.doubleToLongBits 和 Double.longBitsToDouble 转换来保持 double 值。
- Atomic api copy 记录
- atomic copy assign retain
- atomic nonatomic,assign,copy retain
- atomic/nonatomic/retain/assign/copy
- atomic 学习记录
- retain、copy、assign、release、autorelease、nonatomic、atomic
- assign, retain, copy, readonly,readwrite,atomic, nonatomic
- assign, retain, copy, readonly,readwrite,atomic, nonatomic
- 015.assign atomic copy 属性特性
- 015.assign atomic copy 属性特性
- IOS中atomic ,nonatomic, assign, copy ,retain的区别
- OC-property-synthesize-nonatomic-atomic-assign-retain-copy
- 详解atomic,nonatomic,assign,retain,copy;strong/weak
- assign nonatomic atomic copy readonly retain属性声明
- ios中的nonatomic,atomic,assign,copy,retain等含义
- @property参数 retain assign copy readonly readwrite atomic nonatomic
- java中Atomic类之AtomicInteger-api
- copy语法学习记录
- Android监听程序的安装和卸载
- android ndk引入库文件
- Java基础:容器
- Nginx负载均衡策略
- 函数模板
- Atomic api copy 记录
- 决策树算法
- Chrome扩展及应用开发 入门笔记(一)
- 剖析微信公众平台第三方开发
- vb.net 调用wininet.dll的FTP上传文件方法失败
- Android 新控件RecyclerView
- JSTL中if...else...逻辑判断的简单用法
- Java多线程笔记
- php JpGraph 安装配置 基础学习