it-swarm.com.de

Wie bedient der Singleton Bean die gleichzeitige Anfrage?

Ich habe eine Frage, wie Singleton-Beans gleichzeitig gleichzeitige Anfragen bedienen.

Ich habe bei StackOverflow nach dieser Frage gesucht. Dies ist ein Beispiel Link von stackoverflow , aber ich habe nur Details auf hoher Ebene gefunden. Ich möchte ausführliche Informationen darüber, wie eine Singleton-Bean gleichzeitige Anforderungen bedient und wie der Systemprozessor diese Anforderungen sieht.

Ich habe in Bezug auf die gleichzeitige Bearbeitung von Anfragen im Systemprozessor online recherchiert. Sie sagten, dass der Prozessor selbst einen Scheduler hat und dieser Scheduler entscheidet, welche Anfrage bearbeitet wird.

Ok gut. Wenn ich davon ausgehe, dass ich mehr als einen Core-Prozessor habe, wie geht der Scheduler mit gleichzeitigen Anforderungen um?

Kann mir jemand den schrittweisen Prozess erläutern, wie eine Singleton-Bean gleichzeitige Anforderungen in der JVM und im System abwickelt?

Lassen Sie mich mit einem konkreten Beispiel erklären. Ich habe eine Klasse wie Sports:

class Sports {
    public void playFootball() {
    }

    public void playVolleyBall() {
    }
}

Es kommen zwei Anforderungen. Die erste Anforderung führt die playFootball-Methode für die erstellte Singleton-Instanz der Klasse Sports aus. Gleichzeitig führt eine andere Anforderung die playVolleyBall-Methode in derselben erstellten Singleton-Instanz der Klasse Sports aus.

Wie ist es mit einer Singleton-Instanz möglich?

35
saravanakumar

Saravan Kumar,

Ich verstehe die Motivation hinter Ihrer Frage. Bevor ich anfing, an Compilern zu arbeiten, hatte ich auch ein ähnliches Bedürfnis, die Internen der Java Virtual Machine kennenzulernen.

Zuallererst bin ich von Ihrer Frage beeindruckt. Um Ihre Frage zu lösen, muss es einige Punkte der Unterscheidung und des Verständnisses geben. Erstens: Ein Singleton-Muster oder manchmal auch als Anti-Muster bezeichnet, stellt sicher, dass nur eine Instanz dieser Klasse für die JVM (Java Virtual Machine) verfügbar ist. Dies bedeutet, dass wir im Wesentlichen einen globalen Status in eine Anwendung einführen. Ich weiß, dass Sie das verstehen, aber es ist nur eine Klarstellung.

Nun die Interna. 

Beim Erstellen einer Instanz einer Klasse erstellen wir ein Objekt, das sich im gemeinsam genutzten Speicher der JVM befindet. Jetzt führen diese Threads unabhängig voneinander Code aus, der für diese Instanzen ausgeführt wird. Jeder Thread verfügt über einen Arbeitsspeicher, in dem Daten aus dem Hauptspeicher aufbewahrt werden, die von allen Threads gemeinsam genutzt werden. Hier befindet sich der Verweis auf das von Ihnen erstellte Singleton-Objekt. Im Wesentlichen ist es so, dass der Bytecode, der generiert wurde und für das von Ihnen erstellte Singleton-Objekt repräsentativ ist, in jedem dieser Threads ausgeführt wird.

Nun ist das Interne, wie dies geschieht, wie folgt: 

Jeder JVM-Thread verfügt über einen privaten JVM-Stack, der gleichzeitig mit dem Thread erstellt wird. Nun hat die JVM einen Heap, der von allen JVM-Threads gemeinsam genutzt wird. Der Heap ist der Laufzeitdatenbereich, aus dem Speicher für alle Klasseninstanzen und Arrays zugewiesen wird. Der Heapspeicher wird beim Start von VM erstellt. Wenn Ihr Thread die Singleton-Instanz anfordert, zeigt er auf einen Verweis im Heap, in dem sich der Bytecode für dieses Singleton befindet. Es wird der entsprechende Code ausgeführt. In Ihrem Fall wird die erste Methode für die erste Anforderung und die zweite Methode für die zweite Anforderung ausgeführt. Dies ist möglich, da es keine Sperren oder Einschränkungen gibt, die den Compiler daran hindern, den Programmzähler auf den Bereich im Heap zu richten, in dem diese Instanz zugewiesen ist. Die einzige Einschränkung, die die Singleton-Klasse für die Java Virtual Machine auferlegt, besteht darin, dass sie nur eine Instanz im Heap dieser Klasse haben kann. Das ist es einfach. Ansonsten können Sie es 100x von Ihrer Methode aus referenzieren, der Compiler zeigt auf den gleichen Bytecode und führt ihn einfach aus. Aus diesem Grund möchten wir normalerweise, dass die Singleton-Klasse stateless ist. Wenn ein Thread darauf zugreift, möchten wir nicht, dass interne Variablen wegen der fehlenden Parallelitätssteuerung mutiert werden.

Bitte lassen Sie mich wissen, wenn Sie Fragen haben!

70
Devarsh Desai

Eine ideale Singleton-Bean sollte keinen Zustand behalten. Das heißt, es werden keine Variablen vorhanden sein, die etwas spezifisch für die von ihr gelieferte Anforderung speichern. 

Somit hat eine Singleton-Bean einfach stateless-Code (z. B. Controller-Methoden), der für mehrere Anforderungen gleichzeitig ausgeführt werden kann, ohne dass dabei Parallelitätsprobleme auftreten.

Zum Beispiel, wenn Folgendes Ihre Singleton-Bean war:

@Service
public class Calculator {

   public int sum(int a, int b) {
        return a + b;
   } 

}

Einfach ausgedrückt, wenn zwei "Anforderungen" gleichzeitig die sum-Methode des Beans aufrufen, würde dies bedeuten, dass die sum-Methode gleichzeitig in zwei verschiedenen Threads ausgeführt würde. Daher haben sie einen eigenen Ausführungskontext, der sich nicht überschneiden soll. Dies würde ihnen sicher erlauben, gleichzeitig zu laufen.

Wenn die gleiche Bean wie folgt aussehen sollte:

@Service
public class Calculator {

   int incrementalMultiplier = 0;

   public int mulitply(int a, int b) {
        incrementalMultiplier++;
        return a * b * incrementalMultiplier;
   } 

}

Dies kann zu Problemen führen, wenn zwei Anforderungen gleichzeitig bearbeitet werden, da incrementalMultiplier der Status auf Objektebene ist, der von den beiden Anforderungen (Threads) gemeinsam genutzt wird und daher unerwartete Ergebnisse erzeugen kann.

Kurz gesagt, ein zustandsloser Singleton kann zwei Anfragen gleichzeitig bedienen, weil sie sich in unterschiedlichen Threads befinden.

14
Varun Phadnis

Ich habe viele Ermahnungen gesehen, gemeinsame Singleton-Beans stateless zu behalten, und ich wollte einen Anwendungsfall vorstellen, bei dem ein Stateful-Singleton in einer Web-App-Hintergrund-Bean Sinn macht. 

Ich habe eine administrative Web-App, die bei Bedarf zwei getrennte Systeme (einen CRM und einen Digital Assets Manager - DAM) nach Benutzerdaten abfragt, die Datensätze vergleicht und den DAM mithilfe seiner API entsprechend aktualisiert. Dies kann bei sehr vielen Aktualisierungen manchmal sehr lange dauern. Die Web-Benutzeroberfläche zeigt den Status der Aktualisierungen in Echtzeit an, da der Browser das Backing Bean jede Sekunde mit ajax abfragt, um eine Fortschrittsleiste und die Anzahl der verarbeiteten Benutzerkonten anzuzeigen. Die Benutzeroberfläche bietet auch eine Schaltfläche zum Starten des Synchronisierungsvorgangs und eine Schaltfläche zum Beenden. Der Sync-Button ist anfangs aktiviert und der Stop-Button wird nicht gerendert. Nachdem der Benutzer auf die Startschaltfläche geklickt hat, wird die Startschaltfläche deaktiviert und die Stoppschaltfläche aktiviert.

Während die Synchronisierung aktiv ist, möchte ich, dass verschiedene Clients (verschiedene Benutzer auf der Tastatur, die die Web-App in ihren separaten Browsern verwenden) den gleichen Status sehen, d. Dies ist wichtig, da es keinen Sinn macht, einen zweiten Synchronisierungsprozess zu starten, während einer bereits läuft.

2
snakedog

Um im Detail zu wissen, wie die Singleton Bean der gleichzeitigen Anfrage dient, müssen Sie die folgenden Dinge über Spring Beans wissen

  • Bean-Scopes

    Spring verfügt über verschiedene Bean-Gültigkeitsbereiche (z. B. Prototype, Singleton usw.), aber alle diese Gültigkeitsbereiche gelten, wenn die Bean erstellt wird. Zum Beispiel wird eine Bean "Prototyp" -Bereichs jedes Mal erstellt, wenn diese Bean "injiziert" wird. wohingegen eine Bean im Bereich "Singleton" einmal erstellt und innerhalb des Anwendungskontexts freigegeben wird.
    Der Singleton-Bereich ist der Standardbereich von Spring Bean.

  • Erstellung von Bean

    Der gesamte Lebenszyklus von Spring Bean wird vom Spring Container verwaltet (dh ApplicationContext/BeanFacotry) Spring Container verweist intern auf die Bean-Definition (dh XML-Basis oder Annotation-basiert) zum Erstellen der tatsächlichen Instanzen der Klasse, die durch sie definiert wird Bean-Definition . Wenn Spring Container jetzt gestartet wird, bezieht es sich auf die Bean-Definition und führt alle definierten Bean aus.

  • Bean anfragen.

    Wenn Ihr Objekt nun eine Anforderung an die Bohne stellt, übergibt Spring Container die zuvor initialisierte Bohne.

  • Spring Bean Scope

  • Sind die Objekte von Spring sicher?

  • Spring Tutorial 11 - Grundlegendes zu Bean-Bereichen

hoffe das wird dir helfen ...

0
Ashish Jagtap