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

shz.linked.ConcurrentJSNode Maven / Gradle / Ivy

package shz.linked;

import shz.UnsafeHelp;

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

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

* B=16*(n+1) */ @SuppressWarnings("restriction") public class ConcurrentJSNode implements SNode { public volatile long val; protected volatile ConcurrentJSNode next; protected ConcurrentJSNode(long val) { this.val = val; } public static ConcurrentJSNode of(long e) { return new ConcurrentJSNode(e); } public static ConcurrentJSNode of() { return of(0L); } private static final long valOffset; private static final long nextOffset; static { try { Class k = ConcurrentJSNode.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(long expect, long val) { return UnsafeHelp.getUnsafe().compareAndSwapLong(this, valOffset, expect, val); } public final boolean casNext(ConcurrentJSNode expect, ConcurrentJSNode next) { return UnsafeHelp.getUnsafe().compareAndSwapObject(this, nextOffset, expect, next); } @Override public final ConcurrentJSNode next() { return next; } @Override public final void next(SNode node) { next = (ConcurrentJSNode) node; } @Override public final ConcurrentJSNode addNext(SNode node) { ConcurrentJSNode cjsNode = (ConcurrentJSNode) node; ConcurrentJSNode next; do { next = this.next; cjsNode.next = next; } while (!casNext(next, cjsNode)); return cjsNode; } @Override public final ConcurrentJSNode addPrev(SNode node) { ConcurrentJSNode cjsNode = addNext(node); long val; do { val = this.val; } while (!casVal(val, cjsNode.val)); cjsNode.val = val; return this; } @Override public final void poll() { if (next == null) this.val = 0L; else { ConcurrentJSNode next = this.next; if (casNext(next, next.next)) this.val = next.val; } } public final ConcurrentJSNode addNext(long e) { return addNext(of(e)); } public final ConcurrentJSNode addNext(long... es) { ConcurrentJSNode next = this; for (long e : es) next = next.addNext(e); return next; } public final ConcurrentJSNode addPrev(long e) { return addPrev(of(e)); } public final ConcurrentJSNode addPrev(long... es) { for (long e : es) addPrev(e); return this; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy