2011-09-29 12 views
5

ロギング、取引などのクロスカッティングの問題をAOPで扱い、AOPフレームワークのほとんどがこれらのクロスカッティングの問題をサポートしていることを理解しています。私の質問があるAOPでアスペクトとして同期を扱うことができます

  • は、横断的関心事として扱われ、同期することはできますか?
  • はいの場合、この機能をサポートする既存のライブラリ(AspectJとSpring AOPを含む)はありますか?

私は検索しましたが、多くの例は見つかりませんでした。私はいくつかの制限された研究論文(12)に出くわしました。

答えて

1

単なる理論的な「回答」です。 :)

私がAOPを理解しているので、あなたはいくつかの "ポイントカット"/"ジョイントポイント"に独立した振る舞い/ "アドバイス"を追加します。しかし、同期は管理しているコードと密接に関連して使用することを意図しています。

同期を使用する方法は、アドバイスとして添付され、他の「アスペクト」がいくつかの「アドバイス」を定義する「ジョイントポイント」として提供される場合です。

また、いくつかの「ジョイントポイント」を呼び出そうとしているときに、あなたの「アドバイス」の内部で何らかの同期が取られるかもしれません。

1

理論的には、一連のメソッド/クラスに同期を追加するAOPフレームワークを使用することは可能です。実装するのも難しくありません。しかし、それは通常あなたが望むものではありません。同期が多すぎる場合は、デッドロックが発生するか、スレッドを順番に並べ替えるだけで、複数のコアを効果的に使用できないため、同期が少なすぎるほど悪いです。

私は恐れがありません。ブレーカーマルチスレッドプログラミングへのショートカットです。

0

はい、同期は1つの側面として扱うことができます。 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は、読み取り/書き込み操作ごとに新しいアスペクトを作成します。それ以外の場合は、1つのアスペクトだけが作成され、シングルトンオブジェクトのように機能します。詳細はAspectJ in Actionを参照してください。

関連する問題