/** repeated weakCompareAndSet succeeds in changing values when equal to expected */
  public void testWeakCompareAndSet() {
    int[] mark = new int[1];
    AtomicStampedReference ai = new AtomicStampedReference(one, 0);
    assertSame(one, ai.get(mark));
    assertEquals(0, ai.getStamp());
    assertEquals(0, mark[0]);

    do {} while (!ai.weakCompareAndSet(one, two, 0, 0));
    assertSame(two, ai.get(mark));
    assertEquals(0, mark[0]);

    do {} while (!ai.weakCompareAndSet(two, m3, 0, 1));
    assertSame(m3, ai.get(mark));
    assertEquals(1, mark[0]);
  }
 /** attemptStamp succeeds in single thread */
 public void testAttemptStamp() {
   int[] mark = new int[1];
   AtomicStampedReference ai = new AtomicStampedReference(one, 0);
   assertEquals(0, ai.getStamp());
   assertTrue(ai.attemptStamp(one, 1));
   assertEquals(1, ai.getStamp());
   assertSame(one, ai.get(mark));
   assertEquals(1, mark[0]);
 }
 /** get returns the last values of reference and stamp set */
 public void testGetSet() {
   int[] mark = new int[1];
   AtomicStampedReference ai = new AtomicStampedReference(one, 0);
   assertSame(one, ai.getReference());
   assertEquals(0, ai.getStamp());
   assertSame(one, ai.get(mark));
   assertEquals(0, mark[0]);
   ai.set(two, 0);
   assertSame(two, ai.getReference());
   assertEquals(0, ai.getStamp());
   assertSame(two, ai.get(mark));
   assertEquals(0, mark[0]);
   ai.set(one, 1);
   assertSame(one, ai.getReference());
   assertEquals(1, ai.getStamp());
   assertSame(one, ai.get(mark));
   assertEquals(1, mark[0]);
 }
  /**
   * compareAndSet succeeds in changing values if equal to expected reference and stamp else fails
   */
  public void testCompareAndSet() {
    int[] mark = new int[1];
    AtomicStampedReference ai = new AtomicStampedReference(one, 0);
    assertSame(one, ai.get(mark));
    assertEquals(0, ai.getStamp());
    assertEquals(0, mark[0]);

    assertTrue(ai.compareAndSet(one, two, 0, 0));
    assertSame(two, ai.get(mark));
    assertEquals(0, mark[0]);

    assertTrue(ai.compareAndSet(two, m3, 0, 1));
    assertSame(m3, ai.get(mark));
    assertEquals(1, mark[0]);

    assertFalse(ai.compareAndSet(two, m3, 1, 1));
    assertSame(m3, ai.get(mark));
    assertEquals(1, mark[0]);
  }
 public Object setRestartRequired() {
   AtomicStampedReference<State> stateRef = state;
   int newStamp = stamp.incrementAndGet();
   int[] receiver = new int[1];
   // Keep trying until stateRef is RESTART_REQUIRED with our stamp
   for (; ; ) {
     State was = stateRef.get(receiver);
     if (was == State.STARTING || was == State.STOPPING) {
       break;
     }
     synchronized (service) {
       if (stateRef.compareAndSet(was, State.RESTART_REQUIRED, receiver[0], newStamp)) {
         service.stateChanged(State.RESTART_REQUIRED);
         break;
       }
     }
   }
   return Integer.valueOf(newStamp);
 };