Conozco la diferencia entre el método sincronizado y el bloque sincronizado, pero no estoy seguro acerca de la parte sincronizada del bloque.¿Cuál es la diferencia entre sincronizado en lockObject y usando esto como el bloqueo?
Suponiendo que tengo este código
class Test {
private int x=0;
private Object lockObject = new Object();
public void incBlock() {
synchronized(lockObject) {
x++;
}
System.out.println("x="+x);
}
public void incThis() { // same as synchronized method
synchronized(this) {
x++;
}
System.out.println("x="+x);
}
}
En este caso, ¿cuál es la diferencia entre usar cuadro LockObject y el uso de este como la cerradura? Parece ser lo mismo para mí ...
Cuando decide utilizar el bloque sincronizado, ¿cómo decide qué objeto será el bloqueo?
he encontrado la respuesta a mi pregunta en http://stackoverflow.com/questions/3047564/java-synchronized-method-lock-on-object-or-method Si nos fijamos en la respuesta, es muy claro que si hay 2 hilos (t1 y t2) donde t1 llama a x.addA() y t2 llama a x.addB(). Si tanto addA como addB usan esto como el bloqueo, entonces x.addA() y x.addB() no pueden ejecutarse al mismo tiempo. Considerando que si addA y addB utilizan un objeto diferente para el bloqueo, ambos métodos pueden ejecutarse simultáneamente – GantengX
Solo para verificar algo: En el ejemplo anterior, cuando se usa lockObject para proteger eficazmente el acceso a x, ¿no hay una situación donde otro hilo podría entrar después del bloque sincronizado pero antes de la impresión y aumentar x de nuevo? Es decir. ¿realmente necesita la impresión dentro del bloque sincronizado? –
ah cierto, debería haberlo puesto en el bloque sincronizado, pero ya he respondido mi propia pregunta: D – GantengX