java - язык:условия гонки - есть ли способ убедиться, что несколько строк кода будут выполняться вместе?

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

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть страница регистрации, которая получает токены, анализирует их и регистрирует пользователя, если применяются параметры.

Между моментом, когда я проверил токен, и моментом, когда я удалил токен из базы данных, другой пользователь может использовать тот же токен для входа в систему.есть ли способ убедиться, что определенный диапазон строк кода будет выполняться без помех, чтобы у меня не возникло проблемы с состоянием гонки?

Спасибо

Обновить

У меня есть два сервера.

  1. apache tomcat 6
  2. red5 v0.9 (бесплатный сервер потоковой передачи flash-мультимедиа и связи на базе Java)

Я пишу игровое приложение для Facebook.

сама игра написана на Adobe flash builder 2.

сама игра будет обслуживаться с помощью сервера red5.проблема в том, что red5 не получает заголовки запроса и ответа и из-за этого не может извлечь информацию о сеансе для использования для получения информации из facebook.

чтобы устранить проблему, пользователь подключается к серверу tomcat, эта страница проверяет сеанс на наличие информации, связанной с facebook, и использует tinyFBClient для подключения к facebook и сохранения информации в базе данных mysql (сведения о пользователе), чтобы убедиться, что этот же пользователь является пользователем, который собирается подключиться к red5.

как только токен будет создан.страница tomcat отображает HTML-элемент object для отображения соответствующего SWF-файла (game file).страница tomcat передает токен этому SWF-файлу.как только SWF-файл загружен, он принимает этот токен и использует его для подключения к red5 и для того, чтобы узнать информацию о пользователе.

Я надеюсь, что это описание поможет вам понять мои потребности.спасибо всем за вашу поддержку!

Это было полезно?

Решение

Вы могли бы использовать Замок объект.

Использование объектов блокировки имеет преимущества перед более примитивными синхронизированные блоки и методы.

Другие советы

Вы могли бы синхронизировать блок кода таким образом, чтобы его мог выполнять только один поток одновременно.Однако это не кажется очень хорошим решением, так как это замедлит работу вашего приложения.Вы хотели бы, чтобы несколько пользователей входили в систему одновременно.

Как создаются токены?Если бы вы сгенерировали их на стороне сервера в ответ на вход пользователя в систему, то один пользователь не смог бы использовать токен другого пользователя.

Похоже, вам нужен синхронизированный метод / блок:

Смотрите здесь, например (синхронизированный метод)

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

Будьте осторожны , чтобы не пережарить его в другую сторону !Слишком большая синхронизация может привести к возникновению узких мест !

Я не уверен, зачем вы создаете токен для входа в систему.Ваш вопрос, похоже, подразумевает, что этот токен находится в базе данных, а не в памяти.Если это так, синхронизация и мьютексы на самом деле не помогут, все, что вам нужно, это заблокировать запись базы данных с помощью "выбрать для обновления".

Возможно, это приводит к множеству неуместных сложностей, но зачем вы создаете токен для входа в систему?Каждый раз, когда я выполняю вход в систему, я просто собираю идентификатор пользователя и пароль с экрана или входящей формы, проверяю по базе данных, допустима ли комбинация, и если да, то впускаю пользователя.Для чего вам нужен жетон?

Вы говорите, что "удаляете токен из базы данных".Является ли база данных базой данных SQL?Если это так, то вы можете использовать транзакцию, чтобы избежать состояния гонки.Это выглядело бы примерно так:

  1. Создайте уникальный идентификатор сеанса, например UUID sessionID = UUID.randomUUID();
  2. Начать транзакцию
  3. Удалите все токены из базы данных, которые соответствуют токену в запросе, например
    УДАЛИТЬ ИЗ Токенов , ГДЕ tokenId = <requested-token>
  4. Получите количество затронутых строк
  5. Если количество затронутых строк равно ровно 1, значит, токен был действительным.Создайте сеанс, например
    ВСТАВИТЬ В ЗНАЧЕНИЯ сеанса (sessionUUID, userId, loginTime, ...)
  6. Зафиксировать транзакцию

Теперь, если вход в систему прошел успешно (т.е.затронутое количество строк равнялось ровно 1), отправьте клиенту файл cookie, содержащий идентификатор сеанса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top