java: condizioni di gara - c'è un modo per assicurarsi che diverse righe di codice verrà eseguito insieme?

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

  •  19-09-2019
  •  | 
  •  

Domanda

Ho una pagina di registrazione che riceve annuncio gettoni li analizza e login l'utente se si applicano i parametri.

Tra il momento che ho controllato il token, al tempo che ho rimosso il token dal db, un altro utente può utilizzare lo stesso motivo di accesso. c'è un modo per assicurarsi che specifica gamma di linee di codice verrà eseguito con non interferenza, quindi non avrà gara condizione problema?

grazie

update

Ho due assistenti.

  1. tomcat apache 6
  2. red5 v0.9 (basato streaming multimediale flash gratis java e server di comunicazione)

Sto scrivendo un'applicazione gioco per Facebook.

il gioco stesso è scritto in Adobe Flash Builder 2.

il gioco in sé sarà servita utilizzando il server red5. il problema è che red5 non riceve le intestazioni di richiesta e di risposta e per questo motivo non è in grado di recuperare informazioni di sessione da utilizzare al fine di recuperare le informazioni da facebook.

per risolvere il problema che l'utente si connette al server Tomcat, quella pagina controlla la sessione di informazioni relative facebook e usa tinyFBClient per collegarsi a facebook, e per memorizzare le informazioni nei DB MySQL (dettagli utente), al fine di rendere sicuro che questo stesso utente è l'utente che sta per connettersi a red5.

una volta creato un token. Nella pagina Tomcat visualizza un elemento HTML oggetto al fine di mostrare il file SWF corrispondente (file di gioco). Nella pagina Tomcat passa il token a tale file SWF. una volta che il file SWF viene caricato, ci vuole quella pedina e lo utilizza per connettersi a red5 e che trovare le informazioni dell'utente.

Spero che la descrizione aiuta a capire le mie esigenze. Grazie per tutto il vostro supporto!

È stato utile?

Soluzione

È possibile utilizzare un Bloccare oggetto .

Utilizzando oggetti lock ha vantaggi rispetto alla blocchi sincronizzati e metodi .

Altri suggerimenti

Si potrebbe sincronizzare il blocco di codice, in modo tale che solo un thread alla volta poteva eseguirlo. Tuttavia, questo non sembra una soluzione molto buona, in quanto rallenta l'applicazione. Desiderate avere più utenti accedendo contemporaneamente.

Come si creano i token? Se si dovesse generarli sul lato server in risposta ad un utente login, quindi un utente non dovrebbe essere in grado di utilizzare gettone di un altro utente.

Sembra che avete bisogno di un metodo / blocco sincronizzato:

Vedi qui per esempio (metodo sincronizzato)

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

Fare attenzione a non a un eccesso di cuocere l'otherway! Troppo sincronizzazione può portare a strozzature!

Non sono sicuro che il motivo per cui si sta creando un token per un account di accesso. La tua domanda sembra implicare questo token è sulla base di dati e non nella memoria. In tal caso, la sincronizzazione e mutex non saranno di grande aiuto, ciò che è necessario è quello di bloccare il record del database con un "selezionare per l'aggiornamento".

Forse questo diventa in un sacco di complessità irrilevante, ma perché stai creando un gettone per fare un account di accesso? Ogni volta che faccio un login, ho semplicemente raccogliere l'ID utente e la password dallo schermo o dalla forma in entrata, verificare sul database per vedere se la combinazione è valida, e in tal caso lasciare che l'utente in. Che cosa avete bisogno di un gettone per?

Si dice che si "rimuovere il token dal db". È il database di un database SQL? Se è così allora si può utilizzare una transazione per evitare la condizione di competizione. Sarebbe simile a questa:

  1. Crea un ID di sessione univoco, per esempio UUID sessionID = UUID.randomUUID();
  2. iniziare la transazione
  3. Elimina eventuali gettoni dal DB che corrisponde a quello nella richiesta, per esempio
    DELETE FROM WHERE Gettoni TokenID =
  4. Ottieni riga interessata count
  5. Se il conteggio delle righe interessata è esattamente 1, allora il gettone era valido. Creare una sessione, per esempio
    VALORI INSERT INTO Session (sessionUUID, userID, loginTime, ...)
  6. Commit transazioni

Ora, se l'accesso era successo (vale a dire il numero di riga interessata era esattamente 1), inviare al cliente un cookie contenente l'ID di sessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top