• Source
    1. //Implementacion del aspecto de sincronizacion en la estructura de cola circular
    2. aspect ColaCirSincro{
    3.  
    4. private int eltosRellenos = 0; //Variable que contiene la cantidad de elementos actuales en la cola
    5.  
    6. //Captura el caso de que se produzca un llamado al metodo Insertar de la clase ColaCircular y
    7. //se ejecuta el metodo insertar del aspecto
    8. pointcut insertar(ColaCircular c):
    9. instanceof (c) && receptions(void Insertar(Object));
    10.  
    11. //Captura el caso de que se produzca un llamado al metodo Extraer de la clase ColaCircular y
    12. //se ejecuta el metodo extraer del aspecto
    13. pointcut extraer(ColaCircular c):
    14. instanceof (c) && receptions (Object Extraer());
    15.  
    16. //El advice se ejecuta antes de hacer el llamado a la funcion Insertar
    17. before(ColaCircular c):insertar(c) {
    18. antesInsertar(c);
    19. }
    20.  
    21. //Implementa la sincronizacion en el metodo Insertar de la clase ColaCircular
    22. protected synchronized void antesInsertar (ColaCircular c){
    23. while (eltosRellenos == c.getCapacidad()) {
    24. try {
    25. wait();
    26. } catch (InterruptedException ex) {};
    27. }
    28. }
    29.  
    30. //El advice se ejecuta despues de hacer el llamado a la funcion Insertar
    31. after(ColaCircular c):insertar(c) {
    32. despuesInsertar();
    33. }
    34.  
    35. //Aumenta el tamaño de la cola y notifica a los demas hilos que terminó la funcion
    36. protected synchronized void despuesInsertar (){
    37. eltosRellenos++;
    38. notifyAll();
    39. }
    40.  
    41. //El advice se ejecuta antes de hacer el llamado a la funcion Extraer
    42. before(ColaCircular c):extraer(c) {
    43. antesExtraer();
    44. }
    45.  
    46. //Implementa la sincronizacion en el metodo Extraer de la clase ColaCircular
    47. protected synchronized void antesExtraer (){
    48. while (eltosRellenos == 0) {
    49. try {
    50. wait();
    51. } catch (InterruptedException ex) {};
    52. }
    53. }
    54.  
    55. //El advice se ejecuta despues de hacer el llamado a la funcion Extraer
    56. after(ColaCircular c):extraer(c) {
    57. despuesExtraer();
    58. }
    59.  
    60. //Reduce el tamaño de la cola y notifica a los demas hilos que terminó la funcion
    61. protected synchronized void despuesExtraer (){
    62. eltosRellenos--;
    63. notifyAll();
    64. }
    65. }