java: Race Conditions - gibt es eine Möglichkeit, dass mehrere Zeilen Code machen zusammen durchgeführt werden?

StackOverflow https://stackoverflow.com/questions/2222175

  •  19-09-2019
  •  | 
  •  

Frage

Ich habe eine Registrierungsseite, die sie Token Anzeige analysieren und melden Sie den Benutzer, wenn die Parameter gelten erhält.

Zwischen der Zeit, dass ich das Token überprüft, zu der Zeit, als ich das Token aus dem db entfernt wird, kann ein anderer Benutzer den gleichen Token verwenden, um sich anzumelden. gibt es eine Möglichkeit, um sicherzustellen, dass bestimmter Bereich von Zeilen Code mit nicht Störung ausgeführt werden, so dass ich nicht Rennen Zustand Problem hat?

Dank

update

Ich habe zwei Server.

  1. Apache Tomcat 6
  2. red5 v0.9 (kostenlose Java-basierter Flash-Media-Streaming und Kommunikationsserver)

Ich schreibe eine Spielanwendung für Facebook.

das Spiel selbst in Adobe Flash Builder geschrieben 2.

das Spiel selbst bedient wird, um den red5 Server. das Problem ist, dass red5 die Anfrage und Antwort-Header nicht erhalten und aus diesem Grund kann nicht Session-Informationen zu verwenden, um holen Informationen von Facebook.

abrufen

, um das Problem zu beheben, der Benutzer mit dem Tomcatbediener verbinden, die Seite überprüft die Sitzung für Facebook bezogenen Informationen und verwendet tinyFBClient auf Facebook zu verbinden, und die Informationen in den mysql db (Benutzerdaten) zu speichern, um zu machen, sicher, dass dieser gleiche Benutzer der Benutzer, die red5 verbinden geht.

einmal ein Token erstellt. die tomcat-Seite zeigt ein Objekt HTML-Element, um die entsprechende SWF-Datei (Spiel-Datei) zu zeigen. der Kater Seite übergibt das Token auf diese SWF-Datei. sobald die SWF-Datei geladen wird, dauert es dieses Token und verwendet sich, um red5 zu verbinden und für die Benutzerinformationen erfahren.

Ich hoffe, dass die Beschreibung hilft Ihnen, meine Bedürfnisse zu verstehen. Dank für alle Eure Unterstützung!

War es hilfreich?

Lösung

Sie können eine Objekt zu sperren.

Mit Sperren von Objekten hat Vorteile gegenüber der primitiveren synchronisierten Blöcke und Methoden .

Andere Tipps

Sie könnten den Code-Block, so dass nur ein Thread zu einem Zeitpunkt ausführen kann es synchronisieren. Allerdings scheint dies nicht wie eine sehr gute Lösung, wie es Ihre Anwendung verlangsamen. Sie möchten mehrere Benutzer gleichzeitig in der Anmeldung haben.

Wie werden die Token erstellt? Wenn Sie sie auf der Serverseite in Reaktion auf einen Benutzer anmelden erzeugen sind, dann ein Benutzer soll nicht in der Lage sein, eine anderen Benutzers Token zu verwenden.

Klingt wie Sie brauchen eine synchronisierte Methode / Block:

Siehe hier zum Beispiel (synchronisierte Methode)

http://java.sun.com/docs /books/tutorial/essential/concurrency/syncmeth.html

Seien Sie nicht vorsichtig den otherway über-Kochen! Zu viel Synchronisation zu Engpässen führen kann!

Ich bin mir nicht sicher, warum Sie ein Token für eine Anmeldung sind zu schaffen. Ihre Frage scheint dieses Token zu implizieren, auf der Datenbank und nicht im Speicher. Wenn ja, Synchronisation und mutexes wird nicht wirklich helfen, was Sie brauchen, ist die Datenbank-Eintrag mit einem „wählen Sie für die Aktualisierung“ zu sperren.

Vielleicht wird dies in eine Menge von irrelevanter Komplexität, aber warum schaffen Sie ein Token ein Login zu tun? Jedes Mal, wenn ich einen Login tun, ich sammle einfach den Benutzer-ID und das Passwort aus dem Bildschirm oder eingehender Form, überprüfen Sie die Datenbank aus, um zu sehen, ob die Kombination gültig ist, und wenn ja, lassen Sie den Benutzer. Was brauchen Sie ein Token für?

Sie sagen, dass Sie „das Token aus dem db entfernen“. Ist die Datenbank eine SQL-Datenbank? Wenn ja, dann können Sie eine Transaktion verwenden, um die Race-Bedingung zu vermeiden. Es würde wie folgt aussehen:

  1. Erstellen Sie eine eindeutige Sitzungs-ID, z.B. UUID sessionID = UUID.randomUUID();
  2. Begin Transaktion
  3. Löschen Sie alle Tokens von der DB, die eine in der Anfrage übereinstimmt, z
    DELETE FROM Tokens WHERE TokenID =
  4. Holen Sie sich die betroffene Zeilenanzahl
  5. Wenn die betroffene Zeilenanzahl genau 1 ist, dann war das Token gültig. Erstellen Sie eine Sitzung, zum Beispiel
    INSERT INTO Session VALUES (sessionUUID, Benutzer-ID, Login, ...)
  6. Commit-Transaktion

Nun, wenn die Anmeldung erfolgreich war (das heißt die betroffene Zeilenanzahl war genau 1), der Client einen Cookie enthält die Session-ID senden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top