|
Indice | Temas Recientes | Quién Está en LÃnea | Lista de Usuarios | Mi Perfil | Búsqueda | Ayuda |
![]() |
mvnForum » Listar todos los foros » Foro: Curso PLJ » Tema: Sesion 7 Ejercicio 2 |
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 |
|
![]() Extranjero
|
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(); } |
||
|
![]() Miembro
|
Buena pregunta... ![]() 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 ![]() 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 ![]() |
||
|
[Versión imprimible] [Publicar nuevo tema] |