Code: Select all
public class ConcurrentArrayStack implements Stack {
private final AtomicInteger size;
private final T array[];
public ConcurrentArrayStack(int maxCapacity) {
this.array = (T[]) new Object[maxCapacity];
this.size = new AtomicInteger(0);
}
@Override
public T push(T t) {
if(t == null) {
throw new NullPointerException("Null values are not allowed");
}
int currentSize;
T currentValue;
do {
currentSize = size.get();
if(currentSize == array.length) {
return null;
}
currentValue = array[currentSize];
} while(currentValue != null || !size.compareAndSet(currentSize, currentSize + 1));
array[currentSize] = t;
VarHandle.fullFence(); // am Ende jeder Methode lautet: < /p>
[*] Eine Compiler-Barriere (spülen Sie alle ausstehenden Lese-/Schreiben auf einem Compiler-Level)
[*] Flush Store-Buffer (x86), um zu vermeiden, dass abgestandene Daten aus einem anderen Kern gelesen werden.
Wir brauchen keinen Zaun zwischen der Last von Array und Speichern zu Array, da Ladungen nicht in frühere Speicherlager angeordnet sind (x86). < /li>
< /ol>
Frage: Das Ding ist, dass ich nicht überprüfen konnte, dass Fullfence
Code: Select all
release