Wie funktionieren atomar / flüchtig / synchronisiert intern?
Was ist der Unterschied zwischen den folgenden Codeblöcken?
Code 1
private int counter;
public int getNextUniqueIndex() {
return counter++;
}
Code 2
private AtomicInteger counter;
public int getNextUniqueIndex() {
return counter.getAndIncrement();
}
Code 3
private volatile int counter;
public int getNextUniqueIndex() {
return counter++;
}
Hat volatile
auf folgende Weise funktionieren? Ist
volatile int i = 0;
void incIBy5() {
i += 5;
}
gleichbedeutend mit
Integer i = 5;
void incIBy5() {
int temp;
synchronized(i) { temp = i }
synchronized(i) { i = temp + 5 }
}
Ich denke, dass zwei Threads nicht gleichzeitig in einen synchronisierten Block eintreten können... habe ich Recht? Wenn das wahr ist, wie funktioniert dann atomic.incrementAndGet()
Arbeit ohne synchronized
? Und ist es thread-sicher?
Und was ist der Unterschied zwischen dem internen Lesen und Schreiben von flüchtigen Variablen / atomaren Variablen? Ich habe in einem Artikel gelesen, dass der Thread eine lokale Kopie der Variablen hat - was ist das?