2012-05-13 10 views
12

consideran el siguiente código:métodos de Java dos sincronizados en un caso

public class SynchronizedCounter extends Thread { 
    private int c = 0; 

    public synchronized void increment() { 
     c++; 
    } 

    public synchronized void decrement() { 
     c--; 
    } 

    public void run() { 
     for(;;) 
      increment(); 
    } 
} 

static void main(String[] args) { 
    SynchronizedCounter counter = new SynchronizedCounter(); 
    counter.start(); 
    for(;;) 
     counter.decrement(); 
} 

hace esto significa que incremento() y decremento() métodos esperarán entre sí para terminar o no?

EDITAR: y esto no espera?

static void main(String[] args) { 
    SynchronizedCounter counter1 = new SynchronizedCounter(); 
    SynchronizedCounter counter2 = new SynchronizedCounter(); 
    counter1.start(); 
    for(;;) 
     counter2.decrement(); 
} 

Respuesta

13

Sí, la palabra clave synchronized es una abreviatura para:

synchronized(this) { 
    //... 
} 

Así que ambos métodos están bloqueando de manera efectiva en el mismo objeto mutex. Si desea que sean independientes el uno del otro (lo cual es una mala idea en este ejemplo, ya que ambos acceden al mismo valor), consulte Object locking private class members - best practice? (Java).

BTW su SynchronizedCounter debería implementar Runnable en lugar de extender Thread ya que lo está pasando al constructor de otro hilo; ahora es un poco confuso.

+0

sí, tienes razón acerca de la ampliación el hilo, acaba de arreglar el código :) – MBZ

6

El bloqueo está siempre en el objeto completo. Si alguno de ellos es el synchronized, se tiene acceso a los miembros.

En su primer ejemplo, hay dos hilos que compiten por el mismocounter objeto, la que empezaron explícitamente (que llama al método increment() en bucle infinito) y el otro hilo es el hilo principal (que llama a la decrement() infinitamente). En el segundo ejemplo, hay dos objetos creados counter1 y counter2. Estos tendrán sus propios bloqueos independientes entre sí. El bloqueo de un objeto no afecta a los otros subprocesos para acceder a otro objeto. Los dos hilos (el explícito y el hilo principal) adquieren el bloqueo en dos objetos diferentes y, por lo tanto, en no hay contención.

1

¿Esto significa que los métodos de incremento() y decremento() esperarán el uno al otro a terminar o no?

NO, significa que ningún otro subproceso podrá invocar increment() y decrement() cuando un subproceso está dentro de ellos. Para ser completa, otro hilo no pudo ejecutar cualquier método sincronizado de esta instancia/objeto

Se puede llamar a cualquier otro método sincronizado de una sincronizada y sin bloqueo en la misma instancia/objeto

Cuestiones relacionadas