Dar el siguiente códigoapropiante un hilo que se está ejecutando sincronizado método
class Test{
double x;
public void synchronized a()
{
x = 0;
//do some more stuff
}
public void b()
{
x = -1;
}
}
Puede el hilo en un(), en el medio de la modificación de x ser substituida por un subproceso que llama b() en el mismo objeto ?
¿El método no sincronizado se ejecuta como una sola operación atómica?
Creo que la otra forma es posible (el hilo en b() puede ser reemplazado por el hilo que llama a() en el mismo objeto ya que b() no está protegido por el bloqueo del objeto de prueba).
¿Puede alguien arrojar algo de luz sobre esto?
Otro problema que no está relacionado con la pregunta de origen es si un método sincronizado necesita demasiado tiempo para ejecutarse, ¿puede el planificador del sistema operativo adelantarse y cambiar a otro hilo? Si es posible, ¿este hilo liberará el bloqueo? – Chao
@Richard: No, eso no liberará el bloqueo. Un método sincronizado puede tomar todo el tiempo que quiera, y ser adelantado varias veces - nada podrá adquirir ese bloqueo mientras lo tenga el método sincronizado. (Tenga en cuenta que al llamar 'wait()' libera el bloqueo y vuelve a adquirirlo más tarde). –