Duplicar posible:
Avoid synchronized(this) in Java?Sincronización en "esto" o en un objeto privado en Java?
¿Cuál es la diferencia entre las dos piezas de código? ¿Cuáles son las ventajas y desventajas de cada uno?
1)
public class Example {
private int value = 0;
public int getNextValue() {
synchronized (this) {
return value++;
}
}
}
2)
public class Example {
private int value = 0;
private final Object lock = new Object();
public int getNextValue() {
synchronized (lock) {
return value++;
}
}
}
El segundo enfoque es casi siempre mejor (que yo sepa) - pero ¿por qué? ¿Qué impactos negativos tiene la visibilidad de "esto" (solo "el objeto" desde el exterior)? ¿Cómo podría el "código incorrecto" causar interferencia con el objetivo de sincronización? –
¿Sabía que 'pubilc synchronized int getNextValue() {...}' es exactamente igual que 'public int getNextValue() {synchronized (this) {...}}'? – Miquel