rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedQueue.java
changeset 1895 bfaf3300b7ba
parent 1890 212417b74b72
     1.1 --- a/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedQueue.java	Sat Mar 19 10:46:31 2016 +0100
     1.2 +++ b/rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentLinkedQueue.java	Sat Mar 19 12:51:03 2016 +0100
     1.3 @@ -184,38 +184,27 @@
     1.4           * only be seen after publication via casNext.
     1.5           */
     1.6          Node(E item) {
     1.7 -            UNSAFE.putObject(this, itemOffset, item);
     1.8 +            this.item = item;
     1.9          }
    1.10  
    1.11          boolean casItem(E cmp, E val) {
    1.12 -            return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
    1.13 +            if (item == cmp) {
    1.14 +                item = val;
    1.15 +                return true;
    1.16 +            }
    1.17 +            return false;
    1.18          }
    1.19  
    1.20          void lazySetNext(Node<E> val) {
    1.21 -            UNSAFE.putOrderedObject(this, nextOffset, val);
    1.22 +            this.next = val;
    1.23          }
    1.24  
    1.25          boolean casNext(Node<E> cmp, Node<E> val) {
    1.26 -            return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
    1.27 -        }
    1.28 -
    1.29 -        // Unsafe mechanics
    1.30 -
    1.31 -        private static final sun.misc.Unsafe UNSAFE;
    1.32 -        private static final long itemOffset;
    1.33 -        private static final long nextOffset;
    1.34 -
    1.35 -        static {
    1.36 -            try {
    1.37 -                UNSAFE = sun.misc.Unsafe.getUnsafe();
    1.38 -                Class k = Node.class;
    1.39 -                itemOffset = UNSAFE.objectFieldOffset
    1.40 -                    (k.getDeclaredField("item"));
    1.41 -                nextOffset = UNSAFE.objectFieldOffset
    1.42 -                    (k.getDeclaredField("next"));
    1.43 -            } catch (Exception e) {
    1.44 -                throw new Error(e);
    1.45 +            if (next == cmp) {
    1.46 +                next = val;
    1.47 +                return true;
    1.48              }
    1.49 +            return false;
    1.50          }
    1.51      }
    1.52  
    1.53 @@ -808,28 +797,19 @@
    1.54      }
    1.55  
    1.56      private boolean casTail(Node<E> cmp, Node<E> val) {
    1.57 -        return UNSAFE.compareAndSwapObject(this, tailOffset, cmp, val);
    1.58 +        if (tail == cmp) {
    1.59 +            tail = val;
    1.60 +            return true;
    1.61 +        }
    1.62 +        return false;
    1.63      }
    1.64  
    1.65      private boolean casHead(Node<E> cmp, Node<E> val) {
    1.66 -        return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
    1.67 +        if (head == cmp) {
    1.68 +            head = val;
    1.69 +            return true;
    1.70 +        }
    1.71 +        return false;
    1.72      }
    1.73  
    1.74 -    // Unsafe mechanics
    1.75 -
    1.76 -    private static final sun.misc.Unsafe UNSAFE;
    1.77 -    private static final long headOffset;
    1.78 -    private static final long tailOffset;
    1.79 -    static {
    1.80 -        try {
    1.81 -            UNSAFE = sun.misc.Unsafe.getUnsafe();
    1.82 -            Class k = ConcurrentLinkedQueue.class;
    1.83 -            headOffset = UNSAFE.objectFieldOffset
    1.84 -                (k.getDeclaredField("head"));
    1.85 -            tailOffset = UNSAFE.objectFieldOffset
    1.86 -                (k.getDeclaredField("tail"));
    1.87 -        } catch (Exception e) {
    1.88 -            throw new Error(e);
    1.89 -        }
    1.90 -    }
    1.91  }