2014-12-29 1 views
0

Я почти уверен, но лучше понять это: если Runnable запущен в AsyncContext запроса сервлета, является ли код в методе запуска потокобезопасным? Я предполагаю, что это так. Потому что есть новый Runnable за нить, не так ли? Может ли кто-нибудь прояснить этот вопрос?Является ли Runnable запущенным AsyncContext в потоке сервлета безопасным?

+0

Если он потребляет что-то из общей памяти, например. «Список» доступен для всех потоков, тогда он не может быть потокобезопасным. –

+0

@Luiggi: Да, вы правы, я не предполагал, что общие ресурсы не используются. – Gregor

+1

@Sotirios: Вы запускаете AsyncContext с Runnable. – Gregor

ответ

3

Никакой код Java, если явно не написан так, по сути, является потокобезопасным. AsyncContext предоставляет метод start(Runnable), который принимает значение Runnable. Если у вас есть экземпляр Runnable и передать его в качестве аргумента в start(..), а затем повторно использовать его в каком-то другом потоке, его безопасность потока может быть скомпрометирована.

Более того, если ваш Runnable был инициализирован некоторым состоянием, которое используется совместно с другими частями вашего приложения, его безопасность потока снова будет неопределенной.

Это все о том, как вы управляете им.

+0

Вы совершенно правы. Мой вопрос был мотивирован тем фактом, что сервлеты всегда используются повторно по потокам, тогда как Runnable создается для каждого запроса (если вы явно не решите его повторно использовать). Но, да, если у меня есть общее состояние во всех этих Runnables, я получаю те же проблемы, что и с сервлетом. – Gregor

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