Ich habe mit einem Kollegen eine Diskussion über Concurrency Management in Singleton Session Beans. Nach dem Lesen der Oracle documentation, wenn Sie die @ConcurrencyManagement
Annotation weglassen, ist es standardmäßig container-verwaltete Nebenläufigkeit. In der Dokumentation wird es die folgenden über Container verwaltete Singleton Session Beans:Verwalten des gleichzeitigen Zugriffs in einer Singleton-Sitzung Bean
Die javax.ejb.Lock Annotation und einen javax.ejb.LockType Art der Zugriffsebene des Singletons Geschäftsmethoden zu spezifizieren verwendet oder @ Timeout-Methoden
und
Wenn keine @Lock Anmerkung auf dem Singletonklasse vorhanden ist, der Standard-Lock-Typ, @Lock (LockType.WRITE), wird an alle Unternehmen und Timeout-Methoden angewandt.
Nun, wenn Sie die Bohne mit @ConcurrencyManagement(ConcurrencyManagementType.BEAN)
mit Anmerkungen versehen, dann sind Sie dafür verantwortlich, dass der Zustand der Bohne in allen Clients synchronisiert wird, um das synchronized
Schlüsselwort und andere Standard-Java Concurrency-Funktionen verwenden. Der Artikel selbst sagt:
Entwickler, die Singletons mit Bean-gesteuerten Gleichzeitigkeit erstellen sind erlaubt die Programmiersprache Java Synchronisation Primitiven, wie Synchronisation und flüchtig zu verwenden, um Fehler während der gleichzeitigen Zugriff zu verhindern.
Ich habe diese nicht überall im Abschnitt über die Container-verwaltete Gleichzeitigkeit, führt mich zu glauben, dass, wenn man die Dinge selbst synchronisieren möchten, können Sie die Klasse mit @ConcurrencyManagement(ConcurrencyManagementType.BEAN)
zu annotieren müssen.
Mein Kollege hat eine Bemerkung gemacht, dass "Mann ihr Leute seltsame Sachen macht", als er diese Annotation auf meiner Bohne sah, die diese Diskussion anfing.
Keine seiner Beans hat eine @ConcurrencyManagement
Annotation, aber er verwendet das Schlüsselwort synchronized
in der Klasse. Habe ich recht, wenn ich sage, dass eine feinkörnigere Synchronisation, die er verwendet, sinnlos ist, weil alle seine Geschäftsmethoden eine implizite @Lock(LockType.WRITE)
Annotation haben? Dies würde bedeuten, dass, wenn ein Client eine seiner Methoden aufruft, kein anderer Client irgendeine Methode der Bean aufrufen kann, so dass eine explizite Synchronisation innerhalb der Methode nutzlos wäre.
Zum Beispiel, für einige Sperre myLock
in synchronized (myLock)
innerhalb einer seiner Geschäftsmethoden verwendet, würde es keine Konkurrenz für diese Sperre geben, da die Methoden selbst effektiv synchronisiert werden.
Korrigieren Sie mich, wenn ich falsch liege, aber es scheint, wie im Grunde seine Methoden wie folgt aussehen:
public synchronized void myMethod() {
// do stuff
synchronized (lock) {
// modify mutable state
}
}
public synchronized void myOtherMethod() {
// do other stuff
synchronized (lock) {
// modify mutable state
}
}
Unter der Annahme, dass lock
in dieser Singleton Session-Bean erstellt wird nur wandelbar Zustand innerhalb der Bohne, um sie zu schützen scheint, dass es keinen Zweck erfüllt, wenn Container conceiverncy verwendet wird.
Vielen Dank im Voraus für einen Einblick in diese!
Ich glaube nicht, dass das auf unserem Projekt existiert. Er sagte immer wieder: "Ich mache das seit Jahren und es funktioniert gut", aber es schien nicht so, als würde er verstehen, was ich sagte. Es würde gut funktionieren, aber vorausgesetzt, dass das, was ich lese, korrekt ist, wären seine "synchronisierten" Blöcke einfach unnötig und würden den Durchsatz nicht verbessern. –
Ich bin auch wirklich versucht, seinen Code zu testen und zu sehen, ob seine Synchronisation tatsächlich etwas tut, aber ich habe zu viel zu tun ... vielleicht, wenn ich etwas Freizeit habe :) –