2010-09-11 12 views
6

Soy nuevo en Java Threads and synchronization.Pregunta sincronizada Java

Digamos que tengo:

public class MyClass(){ 

    public synchronized void method1(){ 
     //call method2(); 
    } 

    public synchronized void method2(){}; 

} 
  1. ¿Qué significa al sincronizar un method1() en un objeto instancia? Entonces, cuando un hilo adquirió el bloqueo al intentar acceder al synchronized method1(), ¿impide que otros hilos accedan a otro synchronized method2() desde ese mismo objeto?

  2. permite decir un hilo adquiere un bloqueo al acceder metodo1(), pero antes vamos a decir method1() hace una llamada a method2() que es también synchronized. ¿Esto puede ser posible? Quiero decir, ¿hay alguna regla que impida que method1() llame al method2()?

Gracias de antemano.

Respuesta

4
  1. See here:

    no es posible que dos invocaciones de métodos sincronizadas en el mismo objeto para intercalar. Cuando un hilo está ejecutando un método sincronizado para un objeto, todos los otros hilos que invocan métodos sincronizados para el mismo bloque de objetos (suspenden la ejecución) hasta que el primer hilo termina con el objeto.

  2. Desde este hilo mantiene el bloqueo en el objeto actual, se puede invocar method2(), y ninguna otra lata hilo.

7
  1. Sí, utilizando el modificador synchronized método en un método no estático significa que utiliza el monitor de la instancia el método se invoca en, y esto se comparte entre todos dichos métodos.
  2. No: el hilo ya es propietario del monitor, por lo que es libre de entrar en otros bloques protegidos por el mismo monitor.
2

Una nota sobre la pregunta 2, metodo1() también puede llamar a métodos sincronizados también en otros clases que podrían causar un callejón sin salida:

Thread1 llamadas metodo1 sincronizado() que a su vez tiene que llamar method_b sincronizado() en AnotherClass Thread2 mantiene el bloqueo en AnotherClass y está ejecutando un método que necesita llamar a method1() en la clase cuyo bloqueo está en Thread1

Ambos Threads bloquearán la espera de que el otro libere el bloqueo, punto muerto.

2

(1) Esto es equivalente a:

public void method1(){ 
    synchronized (this) { 
     ... 
    } 
} 

manera que se sincronice en la instancia actual. Si reescribimos method2 de la misma manera ...

public void method2(){ 
    synchronized (this) { 
     ... 
    } 
} 

...entonces puede ver claramente que se bloquean en el mismo objeto y, por lo tanto, otros subprocesos no pudieron llamar a method1 o method2 hasta que method1 sale de su bloque synchronized.

(2) synchronized bloques son reentrantes, lo que significa que el mismo hilo puede entrar en otros bloques synchronized que se traban en el mismo objeto tantas veces como lo desee. Según tengo entendido, cada vez que ingresa en un bloque synchronized, Java aumenta un contador en el objeto con el que se está sincronizando, y cada vez que sale de un bloque synchronized, lo disminuye. Cuando ese contador llega a 0, se libera el bloqueo.