2016-07-07 2 views
1

Wissensfrage = kein Code, kein Fehler, keine Beispiele für Berichte.hat AspectJ Ausführung in Thread-Safe?

Ich habe einen Joinpoint über method() von ClassA, und ClassA ist kein Singleton. Ich erstelle MyAspect, die diesen Joinpoint behandeln.

Frage: Wenn es 2 Anrufer von ClassA.method() gibt, und Anrufer auf 2 verschiedenen Threads arbeitet (z. B. Web-Anfragen), läuft AspectJ MyAspect über die 2 verschiedenen Threads oder in einem einzigen?

Ich denke, dass AspectJ führen MyAspect im selben Thread der gewebten Klasse (ClassA in diesem Fall).

Antwort

2

AspectJ wird Ihre Aspekte auf dem aktuellen Thread ausführen. Das bedeutet, wenn Sie eine Multi-Thread-Ausführung haben, wird Ihr Aspekt auch auf mehreren Threads laufen. Wenn Ihr Aspekt mit einem gemeinsamen Status arbeitet, müssen Sie sicherstellen, dass Sie auf sichere Weise auf Ihren freigegebenen Status zugreifen können.

Beachten Sie auch, dass es neben dem Standard Singleton weitere Aspekte Instanziierungsmodelle gibt. Bei einem Singleton-Aspekt wird nur eine Instanz des Aspekts in Ihrer App erstellt. Sie könnten die perthis(), pertarget(), percflow() oder percflowbelow() Modifikatoren verwenden, die sich ändert, wie Ihr Aspekt instanziiert wird erhalten, und AspectJ wird eine neue Instanz der Aspekt auf einem pro-Objekt oder pro-control-Flow Basis erstellen. Möglicherweise können Sie den Aspektstatus mit diesen Instanziierungsmodellen isolieren. Wenn Sie jedoch shared verwenden, gilt weiterhin die Grundregel: Sie müssen sich um den Thread-sicheren Zugriff auf den freigegebenen Zustand kümmern.

+0

Danke für die Antwort und Vorschläge. –