java: condiciones de carrera - ¿Existe una manera de asegurarse de que varias líneas de código se ejecutará en conjunto?

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

  •  19-09-2019
  •  | 
  •  

Pregunta

Tengo una página de registro que recibe fichas ad les analiza y al acceso al usuario si se aplican los parámetros.

Entre el momento en que i comprobado el token, al tiempo que i quitado el token de la db, otro usuario puede usar el mismo contador para iniciar sesión. ¿hay una manera de asegurarse de que rango específico de líneas de código que será ejecutado con no interferencia, por lo que no tendrá problema raza condición?

gracias

actualización

Tengo dos servidores.

  1. Apache Tomcat 6
  2. v0.9 red5 (basado en streaming flash media libre de Java y servidor de comunicaciones)

Estoy escribiendo una aplicación de juego para Facebook.

el juego en sí está escrito en constructor de adobe flash 2.

el juego en sí se servirán utilizando el servidor red5. el problema es que red5 no recibe las cabeceras de petición y respuesta y debido a que no puede recuperar la información de sesión a utilizar con el fin de recabar información de los facebook.

para resolver el problema al usuario conectarse al servidor Tomcat, esa página comprueba la sesión de información relacionada con facebook y utiliza tinyFBClient para conectarse a Facebook, y para almacenar la información en la base de datos MySQL (datos de usuario), con el fin de hacer seguro que este mismo usuario es el usuario que va a conectarse a red5.

Una vez que se crea un token. La página Tomcat muestra un elemento HTML de objetos con el fin de mostrar el archivo SWF correspondiente (archivo del juego). La página Tomcat pasa el testigo a ese archivo SWF. Una vez cargado el archivo SWF, se necesita esa señal y lo utiliza para conectarse a red5 y para que pueda encontrar la información del usuario.

Espero que la descripción que le ayuda a comprender mis necesidades. ¡Gracias por todo tu apoyo!

¿Fue útil?

Solución

Se puede usar un href="http://java.sun.com/docs/books/tutorial/essential/concurrency/newlocks.html" rel="nofollow Lock objeto .

El uso de objetos de bloqueo tiene ventajas sobre el bloques sincronizados y métodos .

Otros consejos

Se puede sincronizar el bloque de código, de tal manera que sólo un hilo a la vez podría ejecutarlo. Sin embargo, esto no parece ser una muy buena solución, ya que se ralentizará su aplicación. ¿Le gustaría tener múltiples usuarios que inician sesión en el mismo tiempo.

¿Cómo se crean fichas? Si se va a generarlos en el lado del servidor en respuesta a un usuario iniciar la sesión, a continuación, un usuario no debería ser capaz de utilizar contadores a otro usuario.

Parece que usted necesita un método / bloque sincronizado:

Vea aquí por ejemplo (método sincronizado)

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

Tenga cuidado de no sobre-cocinar la otherway! El exceso de sincronización puede dar lugar a cuellos de botella!

No estoy seguro de por qué se está creando un token para un inicio de sesión. Su pregunta parece dar a entender esta señal está en la base de datos y no en la memoria. Si es así, la sincronización y el mutex no va a ayudar realmente, lo que necesita es bloquear el registro de base de datos con un "seleccione para la actualización".

Tal vez esto se pone en un montón de complejidad irrelevante, pero ¿por qué estás creando un token para hacer un inicio de sesión? Cada vez que hago un inicio de sesión, yo simplemente recoger el identificador de usuario y la contraseña en la pantalla o en forma de entrante, verifica la base de datos para ver si la combinación es válida, y si es así permitir al usuario. ¿Qué se necesita un token para?

Usted dice que "quita el token de la db". Es la base de datos de una base de datos SQL? Si es así, se puede utilizar una transacción para evitar la condición de carrera. Se vería algo como esto:

  1. Crear un ID de sesión único, por ejemplo, UUID sessionID = UUID.randomUUID();
  2. Comenzar transacción
  3. Elimine los símbolos de la base de datos que coinciden con el de la solicitud, por ejemplo
    CANCELACIÓN de Fichas DONDE TokenID =
  4. Obtener la fila afectada recuento
  5. Si el número de filas afectadas es exactamente 1, entonces el testigo era válida. Crear una sesión, por ejemplo
    INSERTAR en la sesión (sessionUUID, ID de usuario, loginTime, ...)
  6. Commit transacción

Ahora bien, si el inicio de sesión se ha realizado correctamente (es decir, el número de filas afectadas era exactamente 1), enviar al cliente una cookie que contiene el ID de sesión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top