2011-09-29 12 views
5

Entiendo que en AOP cualquier problema transversal como el registro, la transacción, etc. puede tratarse como un aspecto y la mayoría de los marcos AOP admiten muy bien este tipo de preocupaciones transversales.Puede tratarse la sincronización como un aspecto en AOP

Mi pregunta es,

  • ¿Puede la sincronización ser tratados como preocupación transversal?
  • En caso afirmativo, ¿hay bibliotecas existentes (incluidos AspectJ y Spring AOP) que admitan esta funcionalidad de forma predeterminada?

Realicé búsquedas pero no pude encontrar muchos ejemplos. Me encontré con algunos trabajos de investigación restringidos (1, 2).

Respuesta

1

Simplemente una "respuesta" teórica. :)

Según entiendo AOP, agregas comportamientos independientes/"consejos" a algunos "puntos de referencia"/"puntos de unión". Pero la sincronización está destinada a ser utilizada estrechamente relacionada con un código que administra.

Supongo que la forma de utilizar la sincronización es si se adjunta como consejo y se proporcionará a sí mismo como un "punto de unión" para el que otros "aspectos" definirán algunos "consejos".

O puede obtener algún tipo de sincronización dentro de sus "consejos" al tratar de llamar a algunos "puntos de unión".

1

En teoría, es posible tener un marco AOP que agregue sincronización a un conjunto de métodos/clases. Ni siquiera es difícil de implementar. Pero usualmente no es lo que quieres. Demasiada sincronización es tan mala como muy poca sincronización, porque o bien se encuentra con interbloqueos o secuencializa tanto el subprocesamiento, que no puede usar múltiples núcleos de forma efectiva.

Me temo que no hay no brainer atajo a la programación multiproceso.

0

Sí, la sincronización se puede tratar como un aspecto. ¿No es la idea detrás de AOP para manejar las preocupaciones transversales? Luego, con respecto a la sincronización como una preocupación transversal se puede manejar a través de AOP sin definir y usar librerías externas.

Considere el siguiente ejemplo sobre el bloqueo de lectura-escritura. Cada vez que un objeto está sujeto a lectura/escritura, puede capturar el método y proporcionar suficiente funcionalidad para el control de concurrencia.

public abstract aspect ReadWriteLockSynchronizationAspect 
    perthis(readOperations() || writeOperations()) { 

    public abstract pointcut readOperations(); 

    public abstract pointcut writeOperations(); 

    private ReadWriteLock _lock = new SomeReadWriteLock(); 

    before() : readOperations() { 
     _lock.readLock().acquire(); 
    } 

    after() : readOperations() { 
     _lock.readLock().release(); 
    } 

    before() : writeOperations() { 
     _lock.writeLock().acquire(); 
    } 

    after() : writeOperations() { 
     _lock.writeLock().release(); 
    } 
} 

perthis crea un nuevo aspecto para cada operación de lectura/escritura. De lo contrario, solo se creará un aspecto y funciona como un objeto singleton. Para más información, consulte AspectJ in Action.

Cuestiones relacionadas