2012-08-15 4 views
1

Если у меня есть общий объект, который хранится в httpsession.Состояние гонки в общем объекте?

Если я изменяю его время от времени без каких-либо одновременных изменений (например, информация о моем пользователе хранится в сеансе и доступна ТОЛЬКО для одного и того же пользователя за раз (владелец этой информации), есть ли шанс есть какие-то проблемы, связанные с многопоточности и так далее в примере потока

:?. объекта хранится в сессии (нить 1) объект изменяется за нитью, которая служит request1 (пользователь изменил свои данные и сохраняет его в сеансе). объект изменен потоком, который служит запросу2 (пользователь открывает страницу с информацией о пользователе).

Есть ли вероятность, что данные на странице, которые отображаются в запросе2, будут устаревшими (не выполняется аякс или другой асинхронный материал)?

UPD: Моя проблема в том, что он чувствует как это последовательный доступ к общему ресурсу, который проводится в HttpSession (привязан к бетону зарегистрированного пользователя). Это главная причина, твой я не хочу использовать изменчивый материал или синхронизацию.

+0

http://www.ibm.com/developerworks/library/j-jtp09238/index.html посмотреть раздел «Видимость» –

ответ

6

Sure – любое время, когда несколько потоков могут обращаться к тем же данным, есть потенциал для возникновения проблемы.

Пользователь может открыть несколько вкладок/окон и выполнить почти одновременные запросы. Эти запросы будут обрабатываться в недетерминированном количестве времени и последовательности.

+0

Хорошо. Что, если мы думаем, что пользователь WONT откроет несколько вкладок/окон? – hades

+0

@hades Тогда мы, вероятно, думаем не так, потому что пользователи делают то, что мы не думаем.Если есть только последовательный доступ к общему ресурсу, тогда нет проблем - проблема в том, что вы ничего не сказали, что заставляет меня думать, что вы можете * гарантировать *, будет только последовательный доступ. –

+0

ОК, я работаю в компании, где написан специальный клиент, который обертывает интернет-исследователь и который гарантирует, что есть только одна страница за раз. Никакие окна/вкладки не разрешены. Хотя бедные ребята, которые используют это веб-приложение, не могут установить какое-либо программное обеспечение на своих ПК. – hades

4

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

  1. Для того, чтобы испытать проблемы, вытекающие из гонок данных, нет необходимости действительно параллельного доступа — доступа с более чем одной нити достаточно, даже если в моменты, разделенных секунд или минут.

  2. Проблемы, которые могут возникнуть из-за visibility изменений одной нить в другую. В отсутствие happens-before отношений между чтением и записью JVM не требуется распространять любые изменения из локальных кэшей/потокового локального хранилища в основную память, и наоборот: поток чтения не требуется для вытягивания свежих данных из основного Память.

  3. В зависимости от того, какой код у вас есть, иногда компилятор «точно в срок» может даже оптимизировать всю операцию чтения, замечая, что достаточно прочитать первый раз и кеш-память навсегда (поскольку нет happens-before отношение к чтению).

Таким образом, вы, безусловно, необходимо каким-то образом, чтобы обеспечить happens-before отношения, идущий от ваших записей на ваш читает. Что точно зависит от особенностей вашего кода.

Смежные вопросы