java.util.concurrent包源码阅读(二) java.util.concurrent.atomic包
当前位置:以往代写 > JAVA 教程 >java.util.concurrent包源码阅读(二) java.util.concurrent.atomic包
2019-06-14

java.util.concurrent包源码阅读(二) java.util.concurrent.atomic包

java.util.concurrent包源码阅读(二) java.util.concurrent.atomic包

Aomic数据范例有四种范例:AomicBoolean, AomicInteger, AomicLong, 和AomicReferrence(针对Object的)以及它们的数组范例,

尚有一个非凡的AomicStampedReferrence,它不是AomicReferrence的子类,而是操作AomicReferrence实现的一个储存引用和Integer组的扩展类

首先,所有原子操纵都是依赖于sun.misc.Unsafe这个类,这个类底层是由C++实现的,操作指针来实现数据操纵

关于CAS

一种无锁机制,较量并互换, 操纵包括三个操纵数 —— 内存位置(V)、预期原值(A)和新值(B)。假如内存位置的值与预期原值相匹配,那么处理惩罚器会自动将该位置值更新为新值。不然,处理惩罚器不做任何操纵。无 论哪种环境,它城市在 CAS 指令之前返回该位置的值。CAS 有效地说明白“我认为位置 V 应该包括值 A;假如包括该值,则将 B 放到这个位置;不然,不要变动该位置,只汇报我这个位置此刻的值即可”

长处:操纵系统级此外支持,效率更高,无锁机制,低落线程的期待,实际上是把这个任务丢给了操纵系统来做。

这个理论是整个java.util.concurrent包的基本。

关于sun.misc.Unsafe

几个疑问

1)四个根基范例的compareAndSet和weakCompareAndSet实现是一样的?

2)AtomicLong的set要领非线程安详的,为啥?并非线程不全,而是对付Long的Updater,会有VM_SUPPORTS_LONG_CAS,假如JVM的long操纵是原子化的,会回收无锁的CAS来更新,假如不支持就会利用带锁的方法来更新。

AtomicXXXX四个数值范例

1. value成员都是volatile

2. 根基要领get/set

3. compareAndSet

weakCompareAndSet,

lazySet: 利用Unsafe凭据顺序更新参考Unsafe的C++实现)

getAndSet:取当前值,利用当前值和筹备更新的值做CAS

4. 对付Long和Integer

getAndIncrement/incrementAndGet

getAndDecrement/decrementAndGet

getAndAdd/addAndGet

三组要领都和getAndSet,取当前值,加减之获得筹备更新的值,再做CAS,/阁下的区别在于返回的是当前值照旧更新值。

关于数组

1. 没有Boolean的Array,可以用Integer取代,底层实现完全一致,究竟AtomicBoolean底层就是用Integer实现

2. 数组变量volatile没有意义,因此set/get就需要Unsafe来做了,要领组成与上面一致,可是多了一个index来指定操纵数组中的哪一个元素。

关于FieldUpdater

1) 操作反射道理,实现对一个类的某个字段的原子化更新,该字段范例必需和Updater要求的一致,譬喻假如利用 AtomicIntegerFieldUpdater,字段必需是Integer范例,并且必需有volatile限定符。Updater的可以挪用的方 法和数字范例完全一致,特别增加一个该范例的工具为参数,updater就会更新该工具的谁人字段了。

2) Updater自己为抽象类,但有一个私有化的实现,操作门面模式,在抽象类中利用静态要领建设实现

AtomicMarkableReference/AtomicStampedReference

前者ReferenceBooleanPair范例的AtomicReference,ReferenceBooleanPair暗示一个工具和boolean标志的pair

前者ReferenceIntegerPair范例的AtomicReference,ReferenceBooleanPair暗示一个工具和Integer标志的pair

作者:cnblogs 梧留柒

    关键字:

在线提交作业