All Downloads are FREE. Search and download functionalities are using the official Maven repository.

shz.linked.ConcurrentDSNode Maven / Gradle / Ivy

package shz.linked;

import shz.UnsafeHelp;

/**
 * 元素类型为double支持并发的单向链表节点
 * 

* 16*n(n为元素个数) *

* B=16*(n+1) */ @SuppressWarnings("restriction") public class ConcurrentDSNode implements SNode { public volatile double val; protected volatile ConcurrentDSNode next; protected ConcurrentDSNode(double val) { this.val = val; } public static ConcurrentDSNode of(double e) { return new ConcurrentDSNode(e); } public static ConcurrentDSNode of() { return of(0d); } private static final long valOffset; private static final long nextOffset; static { try { Class k = ConcurrentDSNode.class; valOffset = UnsafeHelp.getUnsafe().objectFieldOffset(k.getDeclaredField("val")); nextOffset = UnsafeHelp.getUnsafe().objectFieldOffset(k.getDeclaredField("next")); } catch (Exception e) { throw new Error(e); } } public final boolean casVal(double expect, double val) { return UnsafeHelp.getUnsafe().compareAndSwapObject(this, valOffset, expect, val); } public final boolean casNext(ConcurrentDSNode expect, ConcurrentDSNode next) { return UnsafeHelp.getUnsafe().compareAndSwapObject(this, nextOffset, expect, next); } @Override public final ConcurrentDSNode next() { return next; } @Override public final void next(SNode node) { next = (ConcurrentDSNode) node; } @Override public final ConcurrentDSNode addNext(SNode node) { ConcurrentDSNode cdsNode = (ConcurrentDSNode) node; ConcurrentDSNode next; do { next = this.next; cdsNode.next = next; } while (!casNext(next, cdsNode)); return cdsNode; } @Override public final ConcurrentDSNode addPrev(SNode node) { ConcurrentDSNode cdsNode = addNext(node); double val; do { val = this.val; } while (!casVal(val, cdsNode.val)); cdsNode.val = val; return this; } @Override public final void poll() { if (next == null) this.val = 0d; else { ConcurrentDSNode next = this.next; if (casNext(next, next.next)) this.val = next.val; } } public final ConcurrentDSNode addNext(double e) { return addNext(of(e)); } public final ConcurrentDSNode addNext(double... es) { ConcurrentDSNode next = this; for (double e : es) next = next.addNext(e); return next; } public final ConcurrentDSNode addPrev(double e) { return addPrev(of(e)); } public final ConcurrentDSNode addPrev(double... es) { for (double e : es) addPrev(e); return this; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy