Может ли синхронизация рассматриваться как аспект в АОП - PullRequest
5 голосов
/ 29 сентября 2011

Я понимаю, что в AOP любые сквозные проблемы, такие как ведение журнала, транзакции и т. Д., Могут рассматриваться как один из аспектов, и большинство сред AOP очень хорошо поддерживают такие сквозные задачи.

Мой вопрос,

  • Может ли Синхронизация рассматриваться как сквозная проблема?
  • Если да, существуют ли какие-либо библиотеки (в том числе AspectJ и Spring AOP), которые поддерживают эту функциональность из коробки?

Я искал, но не смог найти много примеров. Я наткнулся на некоторые ограниченные исследовательские работы ( 1 , 2 ).

Ответы [ 3 ]

1 голос
/ 29 сентября 2011

Теоретически возможно иметь платформу AOP, которая добавляет синхронизацию к набору методов / классов. Это даже не сложно реализовать. Но обычно это не то, что вы хотите. Слишком много синхронизации так же плохо, как и слишком мало синхронизации, потому что вы либо сталкиваетесь с тупиками, либо так много секвенизуете свою многопоточность, что не можете эффективно использовать несколько ядер.

Боюсь, что нет ежу понятно ярлык для многопоточного программирования.

1 голос
/ 29 сентября 2011

Просто теоретический «ответ».:)

Как я понимаю АОП, вы добавляете независимое поведение / "советы" в некоторые "точки" / "точки соединения".Но синхронизация предназначена для использования в тесной связи с кодом, которым она управляет.

Я предполагаю, что способ использовать синхронизацию, если она будет присоединена в качестве совета и предоставит себя в качестве "объединенной точки", для которой другие "аспекты "определят некоторые" советы ".

Или вы можете получить какую-то синхронизацию внутри ваших "советов" при попытке вызвать некоторые "точки соединения".

0 голосов
/ 13 ноября 2012

Да, синхронизация может рассматриваться как аспект. Не является ли идея АОП решением сквозных проблем? Затем, рассматривая синхронизацию как сквозную проблему, можно обработать ее через AOP без определения и использования внешних библиотек.

Рассмотрим следующий пример о блокировке чтения-записи. Всякий раз, когда объект подлежит чтению / записи, вы можете захватить метод и предоставить достаточную функциональность для управления параллелизмом.

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 создает новый аспект для каждой операции чтения / записи. В противном случае будет создан только один аспект, и он будет работать как одноэлементный объект. Для получения дополнительной информации проверьте AspectJ в действии .

...