Cuál es la diferencia entre atómico / volátil / sincronizado?

¿Cómo funcionan internamente atómico / volátil / sincronizado?

¿Cuál es la diferencia entre los siguientes bloques de código?

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++; 
}

Hacevolatile trabajar de la siguiente manera? E

volatile int i = 0;
void incIBy5() {
    i += 5;
}

equivalente

Integer i = 5;
void incIBy5() {
    int temp;
    synchronized(i) { temp = i }
    synchronized(i) { i = temp + 5 }
}

Creo que dos hilos no pueden entrar en un bloque sincronizado al mismo tiempo ... ¿estoy en lo cierto? Si esto es cierto, ¿cómo funcionaatomic.incrementAndGet() trabajar sinsynchronized? ¿Y es seguro para subprocesos?

¿Y cuál es la diferencia entre lectura interna y escritura en variables volátiles / variables atómicas? Leí en algún artículo que el hilo tiene una copia local de las variables, ¿qué es eso?

Respuestas a la pregunta(14)

Su respuesta a la pregunta