2010-02-26 8 views
6

Primera pregunta aquí: es una cosa pero fundamental muy corto en Java que no sé ...Java: ¿qué sucede cuando se inicia un nuevo subproceso desde un bloque sincronizado?

En el siguiente caso, es el método run() alguna manera ejecutada con la cerradura que somemethod() adquirió?

public synchronized void somemethod() { 
    Thread t = new Thread(new Runnable() { 
     void run() { 
      ...   <-- is a lock held here ? 
     } 
    } 
    t.start(); 
    ... 
    (lengthy stuff performed here, keeping the lock held) 
    ... 
} 

Respuesta

10

No. run() comienza en su propio contexto, sincronización-sabio. No tiene bloqueos. Si lo hiciera, tendría un punto muerto o violaría las especificaciones que establecen que solo un hilo puede mantener el bloqueo de un objeto en cualquier momento dado.

Si run() volvía a llamar al somemethod() en el mismo objeto, tendría que esperar a que se completara primero la llamada somemethod() que lo creó.

5

No, solo el hilo original tiene el candado (porque solo un hilo puede contener un candado en realidad).

+0

@ammoQ: ok genial, +1 para ti y Xr. Validé la respuesta de Xr porque él necesita puntos :) Eso dijo que ahora tengo otra pregunta, relacionada pero diferente (y he visto que es mejor abrir una nueva pregunta aquí) – cocotwo

0

Supongo que el nuevo hilo comienza a ejecutarse en paralelo al método sincronizado.

someMethod() todavía tiene su propio bloqueo que solo evita que este método se invoque simultáneamente contra esta instancia del objeto.

El hilo no hereda el bloqueo, y solo será inhibido por el bloqueo si el hilo intenta llamar a someMethod() contra el objeto que lo creó si someMethod() se está ejecutando actualmente para ese objeto.

Cuestiones relacionadas