récemment ont trouvé cette tâche d'entrevue de java concurrency:Simple Stack Lock-gratuit
Ecrire Empilement simple sans serrure avec deux méthodes: pousser et pop.
J'ai fait la concent:
import java.util.concurrent.atomic.AtomicInteger;
public class Stack {
private AtomicInteger count = new AtomicInteger(-1);
private Object[] data = new Object[1000];
public void push(Object o) {
int c = count.incrementAndGet();
data[c] = o;
}
public Object pop() {
Object top;
int c;
while (true) {
c = count.get();
if (c == -1) return null;
top = data[c];
if (count.compareAndSet(c, c-1))
return top;
}
}
}
Est-il semblable à l'approche était attendue? Ou "pile sans verrou" signifie quelque chose de différent? S'il vous plaît, aidez un débutant java-interview.
Ceci est un échantillon incorrect, il peut arriver que la séquence est traitée dans l'ordre suivant: 1) poussée: c = count.incrementAndGet() 2) pop: c = count.get(); 3) pop: top = données [c] 4) data [c] = o Vous obtenez donc une valeur ancienne ou non initialisée. Ceci est sans verrou mais pas correct/robuste – SkateScout