ConcurrentlinkQueue<br>ソースコードのcas操作
1805 ワード
まずConcurrentQueueでのNodeの定義を見てみましょう
中にはUNSAFEを呼び出すcasItemの方法がある.compareAndSwapObject(this, itemOffset, cmp, val);
1、CAS操作とは何ですか.
CAS:Compare and Swap、比較して交換します.
java.util.concurrentパッケージでは、synchronouse同期ロックとは異なる楽観的なロックがCASによって実現される.
private static class Node<E> {
private volatile E item;
private volatile Node<E> next;
Node(E item) {
// Piggyback on imminent casNext()
lazySetItem(item);
}
E getItem() {
return item;
}
boolean casItem(E cmp, E val) {
return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
}
void setItem(E val) {
item = val;
}
void lazySetItem(E val) {
UNSAFE.putOrderedObject(this, itemOffset, val);
}
void lazySetNext(Node<E> val) {
UNSAFE.putOrderedObject(this, nextOffset, val);
}
Node<E> getNext() {
return next;
}
boolean casNext(Node<E> cmp, Node<E> val) {
return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
}
// Unsafe mechanics
private static final sun.misc.Unsafe UNSAFE =
sun.misc.Unsafe.getUnsafe();
private static final long nextOffset =
objectFieldOffset(UNSAFE, "next", Node.class);
private static final long itemOffset =
objectFieldOffset(UNSAFE, "item", Node.class);
}
中にはUNSAFEを呼び出すcasItemの方法がある.compareAndSwapObject(this, itemOffset, cmp, val);
1、CAS操作とは何ですか.
CAS:Compare and Swap、比較して交換します.
java.util.concurrentパッケージでは、synchronouse同期ロックとは異なる楽観的なロックがCASによって実現される.