Supongamos que estoy ejecutando un bloque de código synchronized
dentro de un hilo y dentro del bloque synchronized
llamo un método que genera otro hilo para procesar un bloque de código sincronizado que requiere el mismo bloqueo que el primer método . Así que en pseudo código Java:Hilos de Java y bloques sincronizados
public void someMethod() {
synchronized(lock_obj) {
// a whole bunch of stuff...
// this is the last statement in the block
(new Thread(someOtherMethod())).start();
}
// some more code that doesn't require a lock
}
public void someOtherMethod() {
// some setup code that doesn't require a lock
// return the stuff we want to run in another thread
// that does require a lock
return new Runnable() {
@Override
public void run() {
synchronized(lock_obj) {
// some more code
}
}
};
}
No tengo idea de cómo darle sentido a ese código. ¿Es lo que he escrito incluso legal? Sintácticamente no veo ningún problema, pero no estoy seguro de cómo razonar a través de un código como ese. Entonces, cuando ejecuto someOtherMethod()
para crear una instancia de Runnable
, ¿en qué tipo de ámbito se ejecuta el código anterior a la instrucción return? ¿Se ejecuta como parte del primer bloque sincronizado? Supongamos que hay otros subprocesos que también funcionan y que pueden requerir el bloqueo en lock_obj
.
simplemente agregando algo que podría perderse: el bloque sincronizado en someMethod() se cierra tan pronto como se invoca start() y el nuevo subproceso se ejecuta de forma paralela. Esto parece haber sido lo que causó la confusión del OP. –
@AbrahamPhilip - No lo pondría de esa manera. El bloque sincronizado no se cierra cuando se llama a 'start()'. (Sale muy poco tiempo después, porque la llamada a 'start()' pasa a ser la última instrucción en el bloque sincronizado). Más bien, al llamar 'start()' inicia la ejecución de otro hilo (que comienza sin monitores) celebrada), ejecutando el código en el 'Runnable' devuelto por' someOtherMethod() '. Ese otro hilo necesita esperar a que el bloque en 'someMethod()' salga antes de que pueda ingresar su propio bloque sincronizado. –
lo siento, tienes toda la razón. Permítanme reformular, "justo después" se llama start(). Solo quería resaltar eso porque el OP se preguntaba si el ejecutable del segundo subproceso se estaba ejecutando dentro del primer bloque sincronizado (como una respuesta aquí afirmó erróneamente http://stackoverflow.com/a/5295252/3000919). Creo que su comentario lo explica muy bien, gracias :) –