同步可以被看作AOP中的一个方面吗?



我理解在AOP中任何横切关注点,如日志、事务等都可以被视为一个方面,而且大多数AOP框架都很好地支持这些类型的横切关注点。

我的问题是,

  • 可以将同步视为横切关注点吗?
  • 如果是,是否有现成的库(包括AspectJ和Spring AOP)支持这个功能?

我搜索了,但找不到很多例子。不过,我看到了一些限制性的研究论文。

只是一个理论上的"答案"。:)

就我对AOP的理解,你向一些"切入点"/"连接点"添加了独立的行为/"建议"。但是,同步的目的是与它所管理的代码紧密相关。

我想使用同步的方法是,如果它将附加作为建议,并将提供自己作为一个"连接点",其他"方面"将定义一些"建议"。

或者当你尝试调用一些"joint points"时,你可能会在你的"advices"中得到某种同步。

理论上,AOP框架可以向一组方法/类添加同步。它甚至不难实现。但这通常不是你想要的。过多的同步和过少的同步一样糟糕,因为要么会遇到死锁,要么会过多地将线程顺序化,从而无法有效地使用多个内核。

我恐怕没有no brainer多线程编程的快捷方式

是的,同步可以被视为一个方面。AOP背后的思想不是要处理横切关注点吗?然后,将同步视为横切关注点可以通过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为每个读/写操作创建一个新的方面。否则,只会创建一个方面,它就像一个单例对象一样工作。要了解更多信息,请查看Action中的AspectJ。

最新更新