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;
  }
Beispiel #2
0
 protected final boolean casHead(long expect, long newValue) {
   return UNSAFE.compareAndSwapLong(this, C_INDEX_OFFSET, expect, newValue);
 }
Beispiel #3
0
 final boolean cas(long cmp, long val) {
   return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val);
 }