public class AtomicInteger extends Number implements java.io.Serializable {private static final long serialVersionUID = 6214790243416807050L;// setup to use Unsafe.compareAndSwapInt for updates 使用Unsafe類的CAS操作實現更新private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;......//volatile保證可見性private volatile int value;//構造器public AtomicInteger(int initialValue) {value = initialValue;}public AtomicInteger() {}......//CAS更新public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}....../*以下方法都使用循環CAS更新數據*/<pre name="code" class="java"> public final int getAndSet(int newValue) {//以原子方式設置新值for (;;) {int current = get();if (compareAndSet(current, newValue))return current;}}
?
?
?public final int getAndIncrement() {//以原子方式自增 for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return current; } } ...... //以原子方式將輸入值與當前值相加并返回結果 public final int addAndGet(int delta) { for (;;) {//循環 int current = get(); int next = current + delta; if (compareAndSet(current, next))//CAS return next; } } ......}
//An {@code int} array in which elements may be updated atomically.public class AtomicIntegerArray implements java.io.Serializable {......private final int[] array;//存儲數據的int數組......//構造器public AtomicIntegerArray(int length) {array = new int[length];}public AtomicIntegerArray(int[] array) {// Visibility guaranteed by final field guaranteesthis.array = array.clone();//這里會復制傳入的int數組,因此不會改變原來的int數組}public final int length() {return array.length;}......}
import java.util.concurrent.CountDownLatch;import java.util.concurrent.atomic.AtomicReference;public class Test {private static int threadCount=10;private static CountDownLatch countDown=new CountDownLatch(threadCount);public static AtomicReference<User> atomicUserRef = new AtomicReference<User>();private static class ReferenceUpdater implements Runnable{User user;public ReferenceUpdater(User user){this.user=user;}@Overridepublic void run() {for(int i=0;i<1000;i++){User oldUser=atomicUserRef.get();atomicUserRef.compareAndSet(oldUser, user);Thread.yield();}countDown.countDown();}}public static void main(String[] args) throws InterruptedException {Thread[] threads=new Thread[threadCount];for(int i=0;i<threadCount;i++){threads[i]=new Thread(new ReferenceUpdater(new User("name"+i,i)));}for(int i=0;i<threadCount;i++){threads[i].start();;}countDown.await();System.out.println(atomicUserRef.get().getName());System.out.println(atomicUserRef.get().getOld());}static class User {private String name;private int old;public User(String name, int old) {this.name = name;this.old = old;}public String getName() {return name;}public int getOld() {return old;}}}
?
?
?
輸出:
name1 1 每次輸出結果都不確定,10種情況都有可能,但是name屬性和age屬性是匹配的。
?
/**An object reference that may be updated atomically.*/public class AtomicReference<V> implements java.io.Serializable {<pre name="code" class="java"> ......
?
private static final Unsafe unsafe = Unsafe.getUnsafe();//用于CAS更新 ...... private volatile V value;//引用,volatile保證可見性 public AtomicReference(V initialValue) { value = initialValue; } public AtomicReference() { } //利用Unsafe類執行CAS操作 public final boolean compareAndSet(V expect, V update) { return unsafe.compareAndSwapObject(this, valueOffset, expect, update); } ...... //循環CAS public final V getAndSet(V newValue) { while (true) { V x = get(); if (compareAndSet(x, newValue)) return x; } } ......}