com.firefly.utils.concurrent.Atomics Maven / Gradle / Ivy
package com.firefly.utils.concurrent;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
public class Atomics {
private Atomics() {
}
public static boolean updateMin(AtomicLong currentMin, long newValue) {
long oldValue = currentMin.get();
while (newValue < oldValue) {
if (currentMin.compareAndSet(oldValue, newValue))
return true;
oldValue = currentMin.get();
}
return false;
}
public static boolean updateMax(AtomicLong currentMax, long newValue) {
long oldValue = currentMax.get();
while (newValue > oldValue) {
if (currentMax.compareAndSet(oldValue, newValue))
return true;
oldValue = currentMax.get();
}
return false;
}
public static boolean updateMin(AtomicInteger currentMin, int newValue) {
int oldValue = currentMin.get();
while (newValue < oldValue) {
if (currentMin.compareAndSet(oldValue, newValue))
return true;
oldValue = currentMin.get();
}
return false;
}
public static boolean updateMax(AtomicInteger currentMax, int newValue) {
int oldValue = currentMax.get();
while (newValue > oldValue) {
if (currentMax.compareAndSet(oldValue, newValue))
return true;
oldValue = currentMax.get();
}
return false;
}
public static int getAndDecrement(AtomicInteger i, int minValue) {
int p = i.getAndUpdate(prev -> {
if (prev > minValue) {
return prev - 1;
} else {
return minValue;
}
});
return p;
}
public static int getAndIncrement(AtomicInteger i, int maxValue) {
int p = i.getAndUpdate(prev -> {
if (prev < maxValue) {
return prev + 1;
} else {
return maxValue;
}
});
return p;
}
}