可以将同步视为AOP中的一个方面

时间:2011-09-29 06:22:59

标签: java synchronization aop

据我所知,在AOP中,任何交叉问题,如日志记录,事务等都可以视为一个方面,大多数AOP框架都非常支持这些跨领域的问题。

我的问题是,

  • 可以将同步视为横切关注点吗?
  • 如果是,是否有任何现有的库(包括AspectJ和Spring AOP)可以开箱即用?

我搜索但找不到很多例子。我遇到了一些限制性研究论文(12)。

3 个答案:

答案 0 :(得分:1)

只是理论上的“答案”。 :)

据我了解AOP,您可以在某些“切入点”/“关节点”中添加独立行为/“建议”。但同步旨在与其管理的代码紧密相关。

我想使用同步的方法是将它作为建议附加,并将其自身作为“联合点”,其他“方面”将定义一些“建议”。

或者在尝试调用某些“联合点”时,您可能会在“建议”中获得某种同步。

答案 1 :(得分:1)

理论上,可以有一个AOP框架,它可以为一组方法/类添加同步。它甚至都难以实施。但它通常不是你想要的。太多的同步与同步太少一样糟糕,因为您要么遇到死锁,要么将线程序列化太多,以至于无法有效地使用多个内核。

恐怕没有没有脑力的多线程编程的快捷方式。

答案 2 :(得分:0)

是的,可以将同步视为一个方面。 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为每个读/写操作创建一个新方面。否则,只会创建一个方面,它就像一个单例对象。有关详细信息,请查看AspectJ in Action