importjava.util.concurrent.atomic.AtomicInteger;public class AtomicPositiveInteger extendsNumber {private static final long serialVersionUID = -3038533876489105940L;private finalAtomicInteger i;publicAtomicPositiveInteger() {
i= newAtomicInteger();
}public AtomicPositiveInteger(intinitialValue) {
i= newAtomicInteger(initialValue);
}public final intgetAndIncrement() {for(;;) {int current =i.get();int next = (current >= Integer.MAX_VALUE ? 0 : current + 1);if(i.compareAndSet(current, next)) {returncurrent;
}
}
}public final intgetAndDecrement() {for(;;) {int current =i.get();int next = (current <= 0 ? Integer.MAX_VALUE : current - 1);if(i.compareAndSet(current, next)) {returncurrent;
}
}
}public final intincrementAndGet() {for(;;) {int current =i.get();int next = (current >= Integer.MAX_VALUE ? 0 : current + 1);if(i.compareAndSet(current, next)) {returnnext;
}
}
}public final intdecrementAndGet() {for(;;) {int current =i.get();int next = (current <= 0 ? Integer.MAX_VALUE : current - 1);if(i.compareAndSet(current, next)) {returnnext;
}
}
}public final intget() {returni.get();
}public final void set(intnewValue) {if (newValue < 0) {throw new IllegalArgumentException("new value " + newValue + " < 0");
}
i.set(newValue);
}public final int getAndSet(intnewValue) {if (newValue < 0) {throw new IllegalArgumentException("new value " + newValue + " < 0");
}returni.getAndSet(newValue);
}public final int getAndAdd(intdelta) {if (delta < 0) {throw new IllegalArgumentException("delta " + delta + " < 0");
}for(;;) {int current =i.get();int next = (current >= Integer.MAX_VALUE - delta + 1 ? delta - 1 : current +delta);if(i.compareAndSet(current, next)) {returncurrent;
}
}
}public final int addAndGet(intdelta) {if (delta < 0) {throw new IllegalArgumentException("delta " + delta + " < 0");
}for(;;) {int current =i.get();int next = (current >= Integer.MAX_VALUE - delta + 1 ? delta - 1 : current +delta);if(i.compareAndSet(current, next)) {returnnext;
}
}
}public final boolean compareAndSet(int expect, intupdate) {if (update < 0) {throw new IllegalArgumentException("update value " + update + " < 0");
}returni.compareAndSet(expect, update);
}public final boolean weakCompareAndSet(int expect, intupdate) {if (update < 0) {throw new IllegalArgumentException("update value " + update + " < 0");
}returni.weakCompareAndSet(expect, update);
}public bytebyteValue() {returni.byteValue();
}public shortshortValue() {returni.shortValue();
}public intintValue() {returni.intValue();
}public longlongValue() {returni.longValue();
}public floatfloatValue() {returni.floatValue();
}public doubledoubleValue() {returni.doubleValue();
}publicString toString() {returni.toString();
}
@Overridepublic inthashCode() {final int prime = 31;int result = 1;
result= prime * result + ((i == null) ? 0: i.hashCode());returnresult;
}
@Overridepublic booleanequals(Object obj) {if (this == obj) return true;if (obj == null) return false;if (getClass() != obj.getClass()) return false;
AtomicPositiveInteger other=(AtomicPositiveInteger) obj;if (i == null) {if (other.i != null) return false;
}else if (!i.equals(other.i)) return false;return true;
}
}