AtomicReference源码解析
AtomicReference类介绍
AtomicReference类提供了一种读和写都是原子性的对象引用变量。原子意味着多个线程试图改变同一个AtomicReference(例如比较和交换操作)将不会使得AtomicReference处于不一致的状态。AtomicReferenc的compareAndSet()方法可以使得它与期望的一个值进行比较,如果他们是相等的,AtomicReference里的对象会被设置成一个新的引用。
类图
主要属性
1 | private static final Unsafe unsafe = Unsafe.getUnsafe(); |
unsafe:Unsafe类。JDK提供的实现CAS操作的类。
valueOffset:当前值value在当前对象中的偏移量
value:当前值
主要方法
AtomicReference(V)
1 | /** |
根据给定的值,创建一个新的AtomicReference对象
AtomicReference()
1 | /** |
创建一个新的AtomicReference对性爱那个
get()
1 | /** |
获取当前值
set(V)
1 | /** |
设置当前值为newValue
lazySet(V)
1 | /** |
将当前值“慢慢”设置为newValue。这意味着在多线程的极端环境下,可能有一些线程还是能够读取到旧值的。
compareAndSet(V,V)
1 | /** |
如果当前值等于expect,则将当前值更新为update,然后返回true。否则返回false。
weakCompareAndSet(V,V)
1 | /** |
如果当前值等于expect,则将当前值更新为update,然后返回true。否则返回false。
getAndSet()
1 | /** |
返回当前值,并将当前值设置为newValue
getAndUpdate(UnaryOperator)
1 | /** |
获取当前值,并将当前值应用于单元函数,将得到的结果更新至当前值。需要注意的是,这里采用的是一个死循环,极端的多线程情况下,这个循环可能跑很久。
updateAndGet(UnaryOperator)
1 | /** |
将当前值应用于单元函数,并将结果更新值当前值,返回。需要注意的是,这里采用的是一个死循环,极端的多线程情况下,这个循环可能跑很久。
getAndAccumulater(V,BinaryOperator)
1 | /** |
返回当前值,并将当前值和x以用于双元函数,再将得到的结果更新至当前值。需要注意的是,这里采用的是一个死循环,极端的多线程情况下,这个循环可能跑很久。
accumulateAndGet(V,BianryOperator)
1 | /** |
将当前值和x应用于双元函数,并将结果更新值当前值,返回。需要注意的是,这里采用的是一个死循环,极端的多线程情况下,这个循环可能跑很久。
toString()
1 | /** |
返回当前引用的字符串形式。