Para esta solución, cumplimos con las normas de orientación a objetos trasladando las responsabilidades a sus clases.
En efecto, quien tiene la responsabilidad de mantener la integridad de datos, es nuestra clase buffer, por lo que ella se deberá encargar de todo el control de sincronización.
Deberemos modificar el get y el set, haciéndolos synchronized y controlado la integridad, por lo que queda así:
Lo único que hemos hecho es trasladar los bucles de espera a los métodos get y set, y gestionar las esperas sobre este objeto (this.wait(), this.notifyAll())
Es muy importante que recordéis el lanzar el notifyAll() antes de realizar el return, ya que de otra manera, los demás hilos que estuvieran en wait, quedarían esperando por siempre….
La clase GeneraNumero
Dado que la sincronización la soporta Buffer, esta clase no se tiene que preocupar de nada
La clase PresentaNumero
Lo mismo para esta clase
Y por último, la clase Main, no es necesario modificarla. La dejamos tal y como estaba antes:
Igual que lo comentado para la solucion1, dado que no hemos previsto la finalización, deberemos abortar el programa cuando queramos. En eclipse lo hariamos asi: