public boolean offer(final E e) { if (null == e) { throw new NullPointerException("element cannot be null"); } long currentTail; long currentHead = sharedHeadCache; long bufferLimit = currentHead + capacity; do { currentTail = tail; if (currentTail >= bufferLimit) { currentHead = head; bufferLimit = currentHead + capacity; if (currentTail >= bufferLimit) { return false; } UNSAFE.putOrderedLong(this, SHARED_HEAD_CACHE_OFFSET, currentHead); } } while (!UNSAFE.compareAndSwapLong(this, TAIL_OFFSET, currentTail, currentTail + 1)); UNSAFE.putOrderedObject(buffer, sequenceToBufferOffset(currentTail, mask), e); return true; }
protected final boolean casHead(long expect, long newValue) { return UNSAFE.compareAndSwapLong(this, C_INDEX_OFFSET, expect, newValue); }
final boolean cas(long cmp, long val) { return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); }