2011-09-29 12 views
5

Capisco che in AOP tutti i problemi trasversali come la registrazione, la transazione ecc. Possano essere trattati come un aspetto e la maggior parte dei framework AOP supporta molto bene questo tipo di preoccupazioni trasversali.La sincronizzazione può essere trattata come un aspetto in AOP

La mia domanda è,

  • Può la sincronizzazione essere trattata come una preoccupazione trasversale?
  • Se sì, ci sono delle librerie esistenti (inclusi AspectJ e Spring AOP) che supportano questa funzionalità fuori dalla scatola?

Ho cercato ma non ho trovato molti esempi. Mi sono imbattuto in alcuni documenti di ricerca limitati (1, 2).

risposta

1

Solo una "risposta" teorica. :)

Come ho capito AOP, si aggiungono comportamenti/"consigli" indipendenti ad alcuni "punti di riferimento"/"punti comuni". Ma la sincronizzazione è pensata per essere usata strettamente collegata a un codice che gestisce.

Immagino che il modo di usare la sincronizzazione sia se verrà allegato come consiglio e si fornirà come un "punto comune" per il quale altri "aspetti" definiranno alcuni "consigli".

Oppure potresti ottenere una sorta di sincronizzazione all'interno dei tuoi "consigli" mentre provi a chiamare alcuni "punti comuni".

1

In teoria è possibile avere un framework AOP che aggiunge la sincronizzazione a un insieme di metodi/classi. Non è nemmeno difficile da implementare. Ma di solito non è quello che vuoi. Troppa sincronizzazione è altrettanto grave quanto la sincronizzazione troppo pochi, perché si esegue in deadlock o sequenziale il threading così tanto, che non si è in grado di utilizzare più core in modo efficace.

Ho paura che non ci sia la chiavetta senza file per la programmazione multithread.

0

Sì, la sincronizzazione può essere considerata come un aspetto. L'idea di AOP non è in grado di gestire i problemi trasversali? Quindi, per quanto riguarda la sincronizzazione come un problema trasversale, è possibile gestirli tramite AOP senza definire e utilizzare librerie esterne.

Considerare il seguente esempio sul blocco lettura-scrittura. Ogni volta che un oggetto è soggetto a essere letto/scritto, è possibile acquisire il metodo e fornire funzionalità sufficienti per il controllo della concorrenza.

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 nuovo aspetto per ogni operazione di lettura/scrittura. Altrimenti, verrà creato solo un aspetto e funzionerà come un oggetto singleton. Per ulteriori informazioni, consultare AspectJ in Action.

Problemi correlati