转自: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黄埔军校
Java中的`AtomicReference`和`AtomicStampedReference`类就是为了实现这种原子性操作而设计的。这两个工具类都是基于Compare-and-Swap (CAS)算法,CAS是一种无锁同步机制,它提供了在不使用锁的情况下实现线程安全...
static AtomicReference<Integer> atomicReference = new AtomicReference(9); public static void main(String[] args) { while (true) { new Thread(() -> { if (atomicReference.get() > 0) { if ...
private static final AtomicReference<Singleton> instance = new AtomicReference(); private Singleton() {} public static Singleton getInstance() { Singleton current = instance.get(); if (current ...
第一章:Java并发简介 1.1 什么是并发编程 ...5.2 AtomicReference 第六章:线程池及其应用 6.1 ThreadPoolExecutor 6.2 ScheduledThreadPoolExecutor 第七章:Fork/Join框架 7.1 ForkJoinPool 等等
AtomicReference<String> ref1 = new AtomicReference("A"); AtomicReference<String> 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<Singleton> INSTANCE = new AtomicReference(); private Singleton() {} public static Singleton getInstance() { Singleton instance = INSTANCE.get(); if ...
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, ...原子性长整型 AtomicLong,原子性引用型 AtomicReference 修改数据: 一 服务端修改数据: 一 文章知识点与官方知识档案匹配,可进一步学习相关知识
借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。...
原子操作(Atomic Operations):Java提供了一些原子操作类(如AtomicInteger、AtomicReference)保证操作过程不会被其他线程打断。 并发集合(Concurrent Collections):Java并发工具包提供了一套特殊的集合类,...
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue ...25. 原子性引用型 AtomicReference
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue ...25. 原子性引用型 AtomicReference
在Java并发包(java.util.concurrent,简称JUC)中,`Unsafe`类被广泛应用于实现高效、无锁的数据结构,如`AtomicInteger`、`AtomicReference`等。这些类的原子操作,如`getAndSet`、`compareAndExchange`等,都是...
Java的`java.util.concurrent.atomic`包中包含了一系列的原子类,如`AtomicInteger`、`AtomicLong`、`AtomicReference`等。这些类提供了一种在多线程环境下更新变量的方式,无需显式使用`synchronized`关键字或者`...
AtomicReference 是 Java 中的一个原子引用类,用于包装对象,使得对象在并发操作时可以保证原子性。AtomicStampedReference 是一个原子引用类,用于解决 ABA 问题,通过加了版本进行控制。 4. Collections Java ...
- **使用线程安全的对象**:除了原子类之外,Java还提供了一些其他的线程安全对象,比如AtomicInteger、AtomicReference等。这些对象同样提供了原子操作的方法,可用于实现线程间的共享数据。 - **使用锁和条件变量*...
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一...25. 原子性引用型 AtomicReference