Вопрос относительно многопоточной среды сервлета - PullRequest
1 голос
/ 02 июня 2011

Если есть сервлет, внутри контейнера сервлета, такого как Websphere. Сервлет выполнен несколькими потоками. Я хотел бы спросить, что темы делятся? Как переменные распределяются между ними?

Есть ли у них локальная копия следующих переменных?

1) частные / защищенные / публичные окончательные разрешения семафора = новый семафор (50);

2) частные / защищенные / публичные окончательные статические разрешения семафора = новый семафор (50);

3) частные / защищенные / публичные разрешения семафора = новый семафор (50);

4) частные / защищенные / публичные статические разрешения семафора = новый семафор (50);

Как мне объявить семафор, чтобы я мог использовать семафор для управления ими? Я не хочу, чтобы у каждого из них была копия семафора. Спасибо.

Ответы [ 7 ]

2 голосов
/ 02 июня 2011

Каждый поток имеет свой собственный стек, но все они используют одно и то же пространство памяти.Имея это в виду, один экземпляр может быть совместно использован, и, следовательно, его состояние / свойства, среди нескольких потоков.Следовательно, нам нужно заботиться о состоянии, используя синхронизацию или аналогичные методы.

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

Тем не менее, вы должны создать класс, предоставляющий одноэлементный семафор для использования в сервлете.Таким образом, экземпляры сервлета будут использовать один и тот же объект семафора, несмотря ни на что.

2 голосов
/ 02 июня 2011

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

Ваш семафор будет предоставлен в общий доступ, если вы объявите его статическим в своем сервлете, если все классы, которые его используют, живут в одном приложении под одним и тем же загрузчиком классов. Однако в этом случае существует большой риск того, что если ваш путь выполнения не освободит разрешение (например, из-за исключения), вы можете в конечном итоге заблокировать все потоки.

0 голосов
/ 02 июня 2011

Вы не должны рассчитывать на два экземпляра сервлета, даже если они находятся в одной JVM.Контейнеры могут быть скопированы, и ваши сервлеты должны быть без сохранения состояния.Кроме того, спецификация Java EE не позволяет вам выполнять какие-либо манипуляции с потоками внутри.Контейнеры могут разрешить это, но поведение становится специфичным для реализации.Помещая туда семафоры, вы мешаете объединению и можете вызвать проблемы.Используйте сессии, если вам нужно различать разных пользователей.

0 голосов
/ 02 июня 2011

Каждый сервлет выполняется в новом потоке. Технически, существуют рабочие потоки, которые ждут запросов, когда запрос http поступает в контейнер сервлета, этот экземпляр создает новый сервлет (в зависимости от сервлетов, определенных в web.xml) и передает его в рабочий поток. Таким образом, логически каждая переменная не видна другим экземплярам сервлета. Теперь, если вы хотите, чтобы ваша переменная была видимой для всех экземпляров сервлета, вы должны определить ее как статическую, чтобы она использовалась всеми экземплярами одного и того же класса.

0 голосов
/ 02 июня 2011

Сервлеты должны быть поточно-ориентированными. Это означает, что если они имеют какое-либо состояние, они должны быть синхронизированы. Старайтесь не сохранять некоторые состояния внутри сервлетов. Они должны содержать только логику бизнеса / контроллера. Любое состояние, которое вы хотите сохранить, поместите их в servletcontext / request / session, которые синхронизируются контейнером.

0 голосов
/ 02 июня 2011

Сервлеты должны быть поточно-ориентированными. Это означает, что ваши сервлеты должны быть «не сохраняющими состояния» (если вы не действительно знаете, что делаете). По сути, используйте только локальные переменные, а не поля.

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

0 голосов
/ 02 июня 2011

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

Если вы создадите объект Семафор в каждом объекте, у них у всех будут разные объекты, в зависимости от цели.

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