`

AtomicReference

 
阅读更多

转自:http://www.cnblogs.com/skywang12345/p/3514623.html

 

概要

本章对AtomicReference引用类型的原子类进行介绍。内容包括:
AtomicReference介绍和函数列表
AtomicReference源码分析(基于JDK1.7.0_40)
AtomicReference示例

转载请注明出处:http://www.cnblogs.com/skywang12345/p/3514623.html

 

AtomicReference介绍和函数列表

AtomicReference是作用是对"对象"进行原子操作。

AtomicReference函数列表

复制代码
// 使用 null 初始值创建新的 AtomicReference。
AtomicReference()
// 使用给定的初始值创建新的 AtomicReference。
AtomicReference(V initialValue)

// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean compareAndSet(V expect, V update)
// 获取当前值。
V get()
// 以原子方式设置为给定值,并返回旧值。
V getAndSet(V newValue)
// 最终设置为给定值。
void lazySet(V newValue)
// 设置为给定值。
void set(V newValue)
// 返回当前值的字符串表示形式。
String toString()
// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean weakCompareAndSet(V expect, V update)
复制代码

 

AtomicReference源码分析(基于JDK1.7.0_40)

在JDK1.7.0_40中AtomicReference.java的源码如下:

复制代码
public class AtomicReference<V>  implements java.io.Serializable {
    private static final long serialVersionUID = -1848883965231344442L;

    // 获取Unsafe对象,Unsafe的作用是提供CAS操作
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
      try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicReference.class.getDeclaredField("value"));
      } catch (Exception ex) { throw new Error(ex); }
    }

    // volatile类型
    private volatile V value;

    public AtomicReference(V initialValue) {
        value = initialValue;
    }

    public AtomicReference() {
    }

    public final V get() {
        return value;
    }

    public final void set(V newValue) {
        value = newValue;
    }

    public final void lazySet(V newValue) {
        unsafe.putOrderedObject(this, valueOffset, newValue);
    }

    public final boolean compareAndSet(V expect, V update) {
        return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
    }

    public final boolean weakCompareAndSet(V expect, V update) {
        return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
    }

    public final V getAndSet(V newValue) {
        while (true) {
            V x = get();
            if (compareAndSet(x, newValue))
                return x;
        }
    }

    public String toString() {
        return String.valueOf(get());
    }
}
复制代码

说明
AtomicReference的源码比较简单。它是通过"volatile"和"Unsafe提供的CAS函数实现"原子操作。
(01) value是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。
(02) 通过CAS设置value。这保证了:当某线程池通过CAS函数(如compareAndSet函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。

 

AtomicReference示例

复制代码
// AtomicReferenceTest.java的源码
import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceTest {
    
    public static void main(String[] args){

        // 创建两个Person对象,它们的id分别是101和102。
        Person p1 = new Person(101);
        Person p2 = new Person(102);
        // 新建AtomicReference对象,初始化它的值为p1对象
        AtomicReference ar = new AtomicReference(p1);
        // 通过CAS设置ar。如果ar的值为p1的话,则将其设置为p2。
        ar.compareAndSet(p1, p2);

        Person p3 = (Person)ar.get();
        System.out.println("p3 is "+p3);
        System.out.println("p3.equals(p1)="+p3.equals(p1));
    }
}

class Person {
    volatile long id;
    public Person(long id) {
        this.id = id;
    }
    public String toString() {
        return "id:"+id;
    }
}
复制代码

运行结果

p3 is id:102
p3.equals(p1)=false

结果说明
新建AtomicReference对象ar时,将它初始化为p1。
紧接着,通过CAS函数对它进行设置。如果ar的值为p1的话,则将其设置为p2。
最后,获取ar对应的对象,并打印结果。p3.equals(p1)的结果为false,这是因为Person并没有覆盖equals()方法,而是采用继承自Object.java的equals()方法;而Object.java中的equals()实际上是调用"=="去比较两个对象,即比较两个对象的地址是否相等。

分享到:
评论

相关推荐

    Java concurrency之AtomicReference原子类_动力节点Java学院整理

    Java concurrency之AtomicReference原子类_动力节点Java学院整理,动力节点口口相传的Java黄埔军校

    atomicReference 使用和AtomicStampedReference 解决ABA的问题.docx

    Java中的`AtomicReference`和`AtomicStampedReference`类就是为了实现这种原子性操作而设计的。这两个工具类都是基于Compare-and-Swap (CAS)算法,CAS是一种无锁同步机制,它提供了在不使用锁的情况下实现线程安全...

    菜鸟虚怀项目笔试题(1).docx

    static AtomicReference&lt;Integer&gt; atomicReference = new AtomicReference(9); public static void main(String[] args) { while (true) { new Thread(() -&gt; { if (atomicReference.get() &gt; 0) { if ...

    击穿单例模式的Demo示范代码

    private static final AtomicReference&lt;Singleton&gt; instance = new AtomicReference(); private Singleton() {} public static Singleton getInstance() { Singleton current = instance.get(); if (current ...

    JUC面试知识点手册快速版

    第一章:Java并发简介 1.1 什么是并发编程 ...5.2 AtomicReference 第六章:线程池及其应用 6.1 ThreadPoolExecutor 6.2 ScheduledThreadPoolExecutor 第七章:Fork/Join框架 7.1 ForkJoinPool 等等

    Java对象交换方法剖析.zip

    AtomicReference&lt;String&gt; ref1 = new AtomicReference("A"); AtomicReference&lt;String&gt; ref2 = new AtomicReference("B"); ref1.getAndSet(ref2.get()); // A现在指向B ref2.getAndSet(ref1.get()); // B现在指向...

    单例模式讲解案例

    7. 非阻塞单例(基于AtomicReference):使用AtomicReference保证线程安全,同时保持高性能。 ```java import java.util.concurrent.atomic.AtomicReference; public class Singleton { private static final ...

    单例的多种写法和说明比较

    private static final AtomicReference&lt;Singleton&gt; INSTANCE = new AtomicReference(); private Singleton() {} public static Singleton getInstance() { Singleton instance = INSTANCE.get(); if ...

    一个小的java Demo , 非常适合Java初学者学习阅读.rar

    数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, ...原子性长整型 AtomicLong,原子性引用型 AtomicReference 修改数据: 一 服务端修改数据: 一 文章知识点与官方知识档案匹配,可进一步学习相关知识

    Java BigDecimal详解_动力节点Java学院整理

    借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。...

    Java并发编程(一)

    原子操作(Atomic Operations):Java提供了一些原子操作类(如AtomicInteger、AtomicReference)保证操作过程不会被其他线程打断。 并发集合(Concurrent Collections):Java并发工具包提供了一套特殊的集合类,...

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue ...25. 原子性引用型 AtomicReference

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue ...25. 原子性引用型 AtomicReference

    深入分析Java并发编程之CAS

    在Java并发包(java.util.concurrent,简称JUC)中,`Unsafe`类被广泛应用于实现高效、无锁的数据结构,如`AtomicInteger`、`AtomicReference`等。这些类的原子操作,如`getAndSet`、`compareAndExchange`等,都是...

    04 并发编程专题01.zip

    Java的`java.util.concurrent.atomic`包中包含了一系列的原子类,如`AtomicInteger`、`AtomicLong`、`AtomicReference`等。这些类提供了一种在多线程环境下更新变量的方式,无需显式使用`synchronized`关键字或者`...

    Thread基础知识点笔记总结

    AtomicReference 是 Java 中的一个原子引用类,用于包装对象,使得对象在并发操作时可以保证原子性。AtomicStampedReference 是一个原子引用类,用于解决 ABA 问题,通过加了版本进行控制。 4. Collections Java ...

    针对于Executor框架,Java API,线程共享数据

    - **使用线程安全的对象**:除了原子类之外,Java还提供了一些其他的线程安全对象,比如AtomicInteger、AtomicReference等。这些对象同样提供了原子操作的方法,可用于实现线程间的共享数据。 - **使用锁和条件变量*...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一...25. 原子性引用型 AtomicReference

Global site tag (gtag.js) - Google Analytics