2014-09-02 3 views
25

Ich habe eine Frage in Bezug darauf, wie Singleton Bohnen gleichzeitige Anfragen im Detail dienen.Wie dient der Singleton Bean der gleichzeitigen Anfrage?

Ich habe auf StackOverflow in Bezug auf diese Frage gesucht. Dies ist ein Beispiel link from stackoverflow, aber ich fand nur Details auf hoher Ebene. Ich möchte vollständige Details darüber, wie eine Singleton-Bean gleichzeitige Anfragen bedient und wie der Systemprozessor diese Anfragen sehen wird.

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 verarbeitet wird.

Ok gut. Wenn ich annimmt, dass ich mehr als einen Core-Prozessor habe, wie geht der Scheduler dann mit gleichzeitigen Anfragen um?

Kann mir jemand den Schritt-für-Schritt-Prozess erläutern, wie eine Singleton-Bean gleichzeitige Anfragen in der JVM und im System bedient?

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

class Sports { 
    public void playFootball() { 
    } 

    public void playVolleyBall() { 
    } 
} 

Zwei Anfragen kommen in die erste Anforderung der Ausführung der playFootball Methode auf dem erstellten Singleton-Instanz der Klasse Sports. Zur gleichen Zeit führt eine andere Anforderung die playVolleyBall-Methode für dieselbe erstellte Singleton-Instanz der Klasse aus.

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

+0

Nein in diesem Link Antwort ist nicht korrekt für diese Frage. In diesem Benutzer wird gefragt, wie die Singleton-Bean die gleichzeitige Anfrage bedient, aber er gab eine Antwort, wie man eine Singleton-Bean als threadsicher macht. Hier frage ich nicht, wie man eine Singleton-Bohne als threadsicher macht. Ich möchte die Logik dahinter wissen, wie die Singleton Bean gleichzeitige Anfrage dient? – saravanakumar

Antwort

-1

Singleton ist ein Bean-Oszilloskop. Sie müssen damit umgehen, wie Sie für den Zugriff auf mehrere Threads dienen. Sie können Synchronisierung oder gleichzeitige Pakete verwenden. Ref: Are Spring singleton beans thread-safe?

Für gleichzeitige Anfrage, Single Bean wird für mehrere Anfragen nacheinander dienen.

+0

Wenn die Singleton-Bean wird gleichzeitig Anfrage nacheinander dienen, dann, warum wir gehen wir die Synchronisation, weil die Anfrage einen Prozess nach dem anderen bekommen. Hab ich recht ? – saravanakumar

+0

Die gleichzeitige Anfrage beginnt den Methodenaufruf "eins nach dem anderen" (obwohl auch dies nicht vollständig korrekt ist), aber die Ausführung kann vorher beendet werden, so dass ein neuer Thread den Aufruf der gleichen Methode beginnt. Problem ist, wenn die Bean Singleton ist, wird die gleiche Instanz verwendet, und die beiden Ausführungen sehen die gleichen Felder des Singletons; Es kann passieren (und es passiert), dass Sie die erste Ausführung haben, setzen Sie den Wert des Feldes, dann erhalten Sie Preempt, und starten Sie den zweiten Aufruf. Wenn der zweite Aufruf den Wert dieses Feldes ändert, liest der erste Aufruf die geänderten Werte. –

+0

@Dan M Ja, tatsächlich. aber das ist nicht mein Zweifel. Meine Bean hat keinen Status und wurde als FINAL deklariert, um es als thread-safe-Bean zu machen. Mein Zweifel ist, wie die gleiche Bohne (Singleton Bohne) und gleichzeitig die zwei oder mehr Anfrage dienen? – saravanakumar

0

Im Detail zu wissen Wie funktioniert die Singleton Bean die gleichzeitige Anfrage? Sie haben folgende Dinge zu Spring Beans wissen

  • Bean Tive

    Frühling verschiedenen Bohnentive hat (zB Prototyp, Singleton, etc.), aber alle diese Bereiche durchzusetzen ist, wenn die Bohne erstellt. Zum Beispiel wird jedes Mal, wenn diese Bohne "injiziert" wird, eine "Prototyp" -Bereichbohne erzeugt. während ein "singleton" scoped Bean einmal erstellt und im Anwendungskontext geteilt wird.
    "singleton" Bereich ist Standardbereich von Spring Bean.

  • Erstellung von Bean

    den gesamten Lebenszyklus von Spring Bean vom Frühjahr Container verwaltet wird (dh Application/BeanFacotry) Frühling Container bezieht sich intern die Bean-Definition (ieXML Basis ot Annotation basiert) für Erstellen von tatsächlichen Instanzen der Klasse, die durch diese Bean-Definition definiert ist. Jetzt, wenn Spring Container gestartet wird, verweist es auf die Bean-Definition und instatiziert alle definierten Beans.

  • Fordern Sie die Bean an.

    Wenn Ihr Objekt nun eine Anfrage an die Bean stellt, übergibt Spring Container die bereits initialisierte Bean.

  • Spring Bean Scope

  • Are Spring objects thread safe?

  • Spring Tutorial 11 - Understanding Bean Scopes

hoffe das hilft dir ...

+1

Ja, das ist richtig und danke für Ihre Antwort, aber ich konnte keine Erklärung zu meiner Frage (Wie funktioniert die Singleton-Bean die gleichzeitige Anfrage?) In der obigen Antwort sehen. – saravanakumar

+0

für jede Anfrage an Singleton Bean-Container gibt Ihnen die Bean, die bereits zur Startzeit des Containers initialisiert wurde. –

+1

für jede Anfrage an Singleton Bean-Container erhalten Sie die ** gleiche Bean **, die bereits beim Start des Containers initialisiert und wie es die gleiche Bean zum Zeitpunkt der gleichzeitigen Anfrage geben wird? und wie dieselbe Bean die gleiche Arbeit (gleiche Methode in der Klasse) oder andere Arbeit (unterschiedliche Methode in derselben Klasse) in der gleichzeitigen Anfrage macht? – saravanakumar

7

Eine ideale Singleton Bean sollte keinen Zustand halten. Das bedeutet, dass es keine Variablen enthält, die irgendetwas speichern, das für die Anforderung spezifisch ist.

Somit wird ein Singleton-Bean einfach einen zustandslosen Code (z. B. Controller-Methoden) haben, der gleichzeitig für mehrere Anforderungen ohne irgendwelche Probleme im Zusammenhang mit Nebenläufigkeit ausgeführt werden kann. wenn

Zum Beispiel folgende war Ihr Singleton Bohne:

@Service 
public class Calculator { 

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

} 

In einfachen Worten, wenn zwei „Anfragen“ sum Methode der Bohne zur gleichen Zeit aufrufen, das würde bedeuten, die sum Verfahren gleichzeitig ausgeführt werden würde in zwei verschiedenen Threads. Daher werden sie ihren eigenen Ausführungskontext haben, der sich nicht überschneiden wird. Dies würde sicher erlauben, dass sie gleichzeitig laufen.

Wenn die gleiche Bohne war Zustand zu haben, wie folgt:

@Service 
public class Calculator { 

    int incrementalMultiplier = 0; 

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

} 

Dies könnte zu Problemen führen, wenn zwei Anforderungen gleichzeitig dienen, da die incrementalMultiplier der Staat Objektebene ist, die durch die beiden Anfragen geteilt wird (Themen) und könnte daher zu unerwarteten Ergebnissen führen.

Kurz gesagt, ein Stateless Singleton kann zwei Anfragen gleichzeitig bedienen, weil sie in verschiedenen Threads sind.

+0

In der Tat und ich möchte wissen, wie diese ** stateless Bean ** die gleichzeitige Anfrage erfüllen? – saravanakumar

+0

Versucht, es in mehr Details in einfachen Worten zu erklären ... lassen Sie mich wissen, dass es hilft. :) –

+0

Ja-Threads haben ihren eigenen Stack-Speicher und es wird den Methodennamen und die Methodenvariable für jeden Thread einzeln beibehalten. Wenn der Ausführungskontext für jede Anfrage unterschiedlich ist, wie wird die gleiche Bean die beiden verschiedenen Kontexte gleichzeitig bedienen? – saravanakumar

47

Saravan Kumar,

verstehe ich die Motivation hinter Ihrer Frage. Bevor ich anfing, an Compilern zu arbeiten, hatte ich auch einen sehr ähnlichen Wunsch, die Interna der Java Virtual Machine zu kennen.

Zunächst bin ich von Ihrer Frage beeindruckt. Es muss ein paar Punkte der Unterscheidung und des Verständnisses geben, um deine Frage zu lösen. Erstens: Ein Singleton-Muster oder manchmal auch Anti-Pattern genannt, stellt sicher, dass nur eine Instanz dieser Klasse für die JVM 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 ein Punkt der Klärung.

Jetzt die Interna.

Wenn wir eine Instanz einer Klasse erstellen, erstellen wir ein Objekt, das sich im gemeinsamen Speicher von JVM befindet. Jetzt führen diese Threads unabhängig Code aus, der für diese Instanzen gilt. Jeder Thread verfügt über einen Arbeitsspeicher, in dem er Daten aus dem Hauptspeicher speichert, die von allen Threads gemeinsam genutzt werden. Hier befindet sich der Verweis auf das Singleton-Objekt, das Sie erstellt haben. Im Wesentlichen passiert, dass der Byte-Code, der erzeugt wurde und repräsentativ für das Singleton-Objekt ist, das Sie erstellt haben, auf jedem dieser Threads ausgeführt wird.

nun die Einbauten, wie dies geschieht, sind wie folgt:

Jeder virtuellen Java-Maschine-Thread einen eigenen Java Virtual Machine-Stack hat, zur gleichen Zeit wie der Thread erstellt. Nun verfügt die Java Virtual Machine über einen Heap, der von allen Java Virtual Machine-Threads gemeinsam genutzt wird. Der Heap ist der Laufzeitdatenbereich, aus dem Speicher für alle Klasseninstanzen und Arrays zugewiesen wird. Der Heap wird beim Start der virtuellen Maschine erstellt. Wenn Ihr Thread die Singleton-Instanz anfordert, wird er auf einen Verweis im Heap verweisen, in dem sich der Byte-Code für diesen Singleton befindet. Es wird den entsprechenden Code ausführen, in Ihrem Fall wird die erste Methode für die erste Anfrage und die zweite Methode für die zweite Anfrage ausgeführt. Dies ist möglich, weil es keine Sperren oder Einschränkungen gibt, die verhindern, dass der Compiler den Programmzähler auf den Bereich im Heap verweist, dem diese Instanz zugeordnet ist. Die einzige Einschränkung, die die Singleton-Klasse der Java Virtual Machine auferlegt, besteht darin, dass sie nur eine Instanz im Heap dieser Klasse enthalten kann. Das ist es einfach. Davon abgesehen können Sie 100x-mal von Ihrer Methode darauf verweisen, der Compiler wird auf denselben Byte-Code zeigen und ihn einfach ausführen. Aus diesem Grund möchten wir in der Regel, dass die Singleton-Klasse zustandslos ist, denn wenn ein Thread darauf zugreift, möchten wir nicht, dass interne Variablen wegen fehlender Gleichzeitigkeitskontrolle mutiert werden.

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben!

+0

Vielen Dank für Ihre Erklärung. Jetzt habe ich es klar und ich werde Sie wissen lassen, wenn ich irgendwelche Zweifel habe. – saravanakumar

+0

Freut mich, Saravan Kumar zu hören! : 0) Bitte zögern Sie nicht, wenn Fragen auftreten! –

+0

@Devarsh Desai nette Erklärung ... +1 –

2

Ich habe viele Ermahnungen gesehen, um freigegebene Singleton-Beans statuslos zu halten, und ich wollte einen Anwendungsfall vorstellen, in dem ein Stateful Singleton in einer Web-App-Back-Bean sinnvoll ist.

Ich habe eine administrative Webanwendung, die bei Bedarf zwei separate Systeme (ein CRM und ein Digital Assets Manager - DAM) nach Benutzerdaten abfragt, die Datensätze vergleicht und das DAM entsprechend über seine API aktualisiert. Bei sehr vielen Updates dauert dies manchmal sehr lange. Die Web-Benutzeroberfläche zeigt den Status der Updates in Echtzeit an, da der Browser die Backing-Bean mit Hilfe von Ajax jede Sekunde abfragt, um einen Fortschrittsbalken anzuzeigen und wie viele Benutzerkonten er verarbeitet hat. Die Benutzeroberfläche bietet außerdem eine Schaltfläche zum Starten des Synchronisierungsprozesses und eine Schaltfläche zum Stoppen des Vorgangs. Die Synchronisierungsschaltfläche ist anfänglich aktiviert und die Stoppschaltfläche wird nicht gerendert. Nachdem der Benutzer auf die Startschaltfläche geklickt hat, ist die Startschaltfläche deaktiviert und die Stoppschaltfläche wird aktiviert.

Während die Synchronisierung aktiv ist, möchte ich, dass verschiedene Clients (verschiedene Benutzer an der Tastatur, die die Webanwendung in ihren eigenen Browsern verwenden) den gleichen Status sehen, d. H. Die Fortschrittsanzeige und Anzahl der verarbeiteten Benutzerkonten und die Schaltflächenzustände. Dies ist wichtig, da es keinen Sinn macht, einen zweiten Synchronisierungsprozess zu starten, während einer bereits in Bearbeitung ist.

Verwandte Themen