java: condições de corrida - existe uma maneira de certificar-se de várias linhas de código será executado em conjunto?

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

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu tenho uma página de registro que recebe fichas ad analisá-los e login o usuário se os parâmetros aplicáveis.

Entre o momento que eu verifiquei o token, ao tempo que eu removi o token do db, outro usuário pode usar o mesmo símbolo para login. há uma maneira para se certificar de que faixa específica de linhas de código será executado com não interferência, então eu não terá corrida problema condição?

graças

actualizar

Eu tenho dois servidores.

  1. apache tomcat 6
  2. v0.9 red5 (mídia flash baseadas em Java livre de streaming e servidor de comunicação)

Eu estou escrevendo um aplicativo de jogo para o Facebook.

O jogo em si é escrito em adobe flash builder 2.

O jogo em si será servido usando o servidor red5. o problema é que red5 não recebe a solicitação e cabeçalhos de resposta e por isso não é possível recuperar informações da sessão para uso, a fim de buscar informações do Facebook.

para resolver o problema que o usuário se conectar ao servidor tomcat, essa página verifica a sessão para facebook informações relacionadas e utiliza tinyFBClient para se conectar ao Facebook, e para armazenar as informações no banco de dados mysql (detalhes do usuário), a fim de fazer Certifique-se que esse mesmo usuário é o usuário que vai ligar a red5.

uma vez por token é criado. a página tomcat exibe um elemento HTML objeto, a fim de mostrar o arquivo SWF relevante (arquivo do jogo). a página tomcat passa o token para esse arquivo SWF. Depois que o arquivo SWF é carregado, é preciso que token e usa-lo para conectar a red5 e para que possa descobrir as informações do usuário.

Espero que essa descrição ajuda a entender minhas necessidades. obrigado por todo seu apoio!

Foi útil?

Solução

Você pode usar um href="http://java.sun.com/docs/books/tutorial/essential/concurrency/newlocks.html" rel="nofollow noreferrer"> objeto .

Usando bloqueio objetos tem vantagens em relação a mais primitiva blocos sincronizados e métodos .

Outras dicas

Você pode sincronizar o bloco de código, de modo que apenas um thread por vez pode executá-lo. No entanto, isso não parece ser uma solução muito boa, uma vez que irá retardar a sua aplicação. Você gostaria de ter vários usuários login simultaneamente.

Como são símbolos criados? Se você fosse para gerá-los no lado do servidor em resposta a um registro de usuário em, em seguida, um usuário não deve ser capaz de usar de outro usuário token.

Parece que você precisa de um método / bloco sincronizado:

Veja aqui, por exemplo (método sincronizado)

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

Tenha cuidado para não over-cozinhá-lo a otherway! Demasiada sincronização pode levar a gargalos!

Eu não sei por que você está criando um token para um login. Sua pergunta parece implicar este token é no banco de dados e não na memória. Se assim for, sincronização e semáforos não irão realmente ajudar, o que você precisa é para bloquear o registro de banco de dados com um "selecionar para atualização".

Talvez isso fica em um monte de complexidade irrelevante, mas por que você está criando um símbolo para fazer um login? Toda vez que eu faço um login, eu simplesmente recolher o ID de usuário e senha da tela ou forma de entrada, verificação no banco de dados para ver se a combinação é válida, e se assim que deixe o usuário. O que você precisa de um token para?

Você diz que "remover o token do db". É o banco de dados de um banco de dados SQL? Se sim, então você pode usar uma transação para evitar a condição de corrida. Seria algo parecido com isto:

  1. Criar um ID de sessão única, por exemplo, UUID sessionID = UUID.randomUUID();
  2. Comece a transação
  3. Exclua quaisquer fichas do DB que correspondem a do pedido, por exemplo
    DELETE FROM Tokens ONDE TokenID =
  4. Obter linha afetada count
  5. Se a contagem de linha afetada é exatamente 1, então o token era válido. Criar uma sessão, por exemplo
    VALORES INSERT INTO sessão (sessionUUID, userID, loginTime, ...)
  6. Commit transação

Agora, se o login foi bem sucedida (ou seja, o número de linhas afetado foi exatamente 1), enviar ao cliente um cookie contendo a identificação da sessão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top