mvnForum Homepage Bienvenido domingo  |  Terminar sesión   
  Búsqueda  
  Indice |  Temas Recientes |  Quién Está en Línea |  Lista de Usuarios |  Mi Perfil |  Búsqueda |  Ayuda


Ir a »
Total de mensajes en este tema: 2 [Eliminar este Tema] [Mover este Tema]
[Ańadir a Mis Favoritos] [Ańadir un aviso a este tema] [Publicar nuevo tema]
Autor
Tema Anterior Este tema ha sido visto 22 veces y tiene 1 respuesta Tema Siguiente
Masculino rsm
Extranjero



Ingresó: Jul 1, 2004
Mensajes: 11
Estado: Desconectados

Adjuntar archivo   Editar este mensaje   Sesion 7 Ejercicio 2 Responder a este mensaje
Responder citando
[Eliminar este Tema]

Respecto a los wait y notifyAll de este ejemplo hay una cosa que no entiendo. ¿Tienen los métodos produce y consume cada uno su propio cerrojo o existe un único cerrojo para todos los métodos synchronized?

public synchronized int consume() {

/* Si no hay datos disponibles esperar a que se produzcan */

if (!disponible) {
try {
wait();
}
catch (InterruptedException e) { }
}

/* Ya no hay datos disponibles */

disponible=false;

/* Notificar de que el recipiente esta libre a productores en espera */

notifyAll();

return valor;
}

public synchronized void produce(int valor) {

/* Si hay datos disponibles esperar a que se consuman */

if (disponible) {
try {
wait();
}
catch (InterruptedException e) { }
}

this.valor = valor;

/* Ya hay datos disponibles */

disponible=true;

/* Notificar de la llegada de datos a consumidores a la espera */

notifyAll();

}
[Jul 16, 2004 11:53:40 AM] Print Post    rjsm1@alu.ua.es Reportar mensaje ofensivo  Ir al inicio 
Masculino nacho
Miembro



Ingresó: Feb 1, 2004
Mensajes: 63
Estado: Desconectados

Adjuntar archivo   Editar este mensaje   Re: Sesion 7 Ejercicio 2 Responder a este mensaje
Responder citando
[Eliminar este mensaje]

Buena pregunta...smile

La respuesta la tienes a medias entre la documentación de la API de Java para los métodos wait() y notify(), y los apuntes de hilos.

Aunque en los apuntes lo explica por encima, quizá no lo deja del todo claro (sinceramente, nunca me había hecho esta pregunta hasta ahora smile ), los he modificado para aclarar la situación:

Cada objeto complejo Java que creemos tiene una variable cerrojo, que es la misma para cualquier método de dicho objeto. Es decir, si creamos un objeto Recipiente, el cerrojo de dicho objeto es el mismo para "consume" y para "produce". Si creamos otro Recipiente, tendrá un cerrojo distinto, al ser un objeto distinto (aunque de la misma clase).

Por lo tanto, sólo un hilo podrá entrar a la vez en el código de "produce" y "consume" de un recipiente. Si entra primero un consumidor, y no hay nada que consumir, hará un "wait" en "consume", con lo que liberará el cerrojo y permitirá que otro hilo entre... y lo mismo si luego entra otro consumidor...

Cuando entre un productor en "produce", pondrá un nuevo valor y hará un "notify" o "notifyAll". Esto implica despertar a alguien que duerme dentro del cerrojo, PERO (tal y como pone en la API de Java) que no podrá continuar ejecutando hasta que quien lo despertó no abandone la zona crítica.

Espero que esto aclare tus dudas smile
[Jul 16, 2004 1:14:08 PM] Print Post    iiborra@dccia.ua.es Reportar mensaje ofensivo  Ir al inicio 
[Versión imprimible] [Publicar nuevo tema]