java: conditions de course - est-il un moyen pour vous assurer que plusieurs lignes de code seront exécutées ensemble?

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

  •  19-09-2019
  •  | 
  •  

Question

J'ai une page d'inscription qui reçoit des jetons annonce les analyser et connecter l'utilisateur si les paramètres sont applicables.

Entre le moment où le jeton i vérifié, au moment où i enlevé le jeton à partir de la db, un autre utilisateur peut utiliser le même jeton pour ouvrir une session. est-il un moyen de faire en sorte que gamme spécifique de lignes de code sera exécuté avec aucune interférence, donc je n'aura pas de problème condition de course?

Merci

mise à jour

J'ai deux serveurs.

  1. 6 tomcat apache
  2. red5 v0.9 (streaming media flash basé java libre et le serveur de communication)

J'écris une application de jeu pour Facebook.

le jeu lui-même est écrit dans le constructeur adobe flash 2.

le jeu lui-même sera servi en utilisant le serveur Red5. le problème est que red5 ne reçoit pas les en-têtes de requête et de réponse et à cause de cela ne peut pas récupérer des informations de session à utiliser afin de récupérer des informations de facebook.

pour résoudre le problème de l'utilisateur se connecter au serveur tomcat, cette page vérifie la session d'informations relatives à Facebook et utilise tinyFBClient pour se connecter à facebook, et pour stocker les informations dans les mysql db (informations utilisateur), afin de faire sûr que ce même utilisateur est l'utilisateur qui va se connecter à red5.

une fois un jeton est créé. la page tomcat affiche un élément HTML objet pour afficher le fichier SWF correspondant (fichier de jeu). la page tomcat transmet le jeton à ce fichier SWF. une fois que le fichier SWF est chargé, il prend ce jeton et l'utilise pour se connecter à red5 et à trouver les informations utilisateur.

J'espère que cette description vous aide à comprendre mes besoins. Merci pour tout votre soutien!

Était-ce utile?

La solution

Vous pouvez utiliser un Verrouillez objet .

Utilisation des objets de verrouillage a des avantages sur plus primitif blocs synchronisés et méthodes .

Autres conseils

Vous pouvez synchroniser le bloc de code, de sorte qu'un seul thread à la fois pourrait l'exécuter. Toutefois, cela ne semble pas être une très bonne solution, car il va ralentir votre application. Vous souhaitez avoir plusieurs utilisateurs qui se connectent en même temps.

Comment sont créés les jetons? Si vous deviez les générer sur le côté serveur en réponse à un utilisateur connecté, puis un utilisateur ne doit pas être en mesure d'utiliser le jeton d'un autre utilisateur.

On dirait que vous avez besoin d'une méthode synchronisée / bloc:

Voir ici par exemple (méthode synchronisée)

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

Veillez à ne pas trop cuire le otherway! Trop synchronisation beaucoup peut conduire à désengorgement!

Je ne sais pas pourquoi vous créez un jeton pour une connexion. Votre question semble impliquer ce jeton est sur la base de données et non en mémoire. Dans ce cas, la synchronisation et mutex ne va pas aider vraiment, ce que vous avez besoin est de verrouiller l'enregistrement de base de données avec un « sélectionnez la mise à jour ».

Peut-être que cela entre dans beaucoup de complexité hors de propos, mais pourquoi êtes-vous de créer un jeton pour faire une connexion? Chaque fois que je fais une connexion, je collectionne simplement le code d'utilisateur et mot de passe de l'écran ou sous forme d'entrée, vérifiez contre la base de données pour voir si la combinaison est valable, et le cas échéant permettre à l'utilisateur. Que avez-vous besoin d'un jeton pour?

Vous dites que vous « retirer le jeton du db ». La base de données d'une base de données SQL? Si oui, alors vous pouvez utiliser une transaction pour éviter la condition de course. Il ressemblerait à quelque chose comme ceci:

  1. Créer un ID de session unique, par exemple UUID sessionID = UUID.randomUUID();
  2. Début de la transaction
  3. Supprimez tous les jetons de la DB qui correspondent à celle de la demande, par exemple
    SUPPRIMER DE Tokens OU TokenID =
  4. Obtenez le nombre row affected
  5. Si le nombre de lignes affectées est exactement 1, le jeton était valide. Créer une session, par exemple
    INSERT INTO session VALEURS (sessionUUID, userID, loginTime, ...)
  6. commit transaction

Maintenant, si la connexion a réussi (à savoir le nombre de lignes affectées était exactement 1), envoyer au client un cookie contenant l'ID de session.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top