2015-02-27 3 views
1

Я пишу приложение Tomcat, которое должно поддерживать некоторые внутренние состояния по разным запросам, поэтому мне нужно поделиться чем-то между различными потоками, созданными Tomcat. Мой вопрос в том, что если я напишу такой код, будет Map (то есть static классу), которые будут совместно использоваться потоками, созданными Tomcat.Как Tomcat создает потоки внутри?

public class sessionManager extends HttpServlet { 
    private static HashMap<Integer, String> Map; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // logic 
    } 
} 

Я предполагаю, что я действительно не понимаю, как это Tomcat создать много темы из одного класса.

+0

@DaveNewton Я даже не знаю, что такое область применения? – qweruiop

ответ

2

Мой вопрос, если я пишу код, как это будет Map (который static к классу) быть разделены между потоками, созданных Tomcat [?]

Да. Он будет передаваться через (потенциально) несколько потоков.

Я думаю, что я действительно не понимаю, как Tomcat создает много потоков из одного класса.

Нити не связаны с классами. Поток - последовательность инструкций. Он представляет собой выполнение вашего кода.

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

+0

Хорошо, я вижу. Довольно ясно. Не могли бы вы указать на ссылку о __It будет генерировать один экземпляр вашего 'sessionManager' class__? – qweruiop

+0

@ bl4ck5un См. Главу 2.2 [Спецификация сервлета] (http://download.oracle.com/otndocs/jcp/servlet-3.0-fr-eval-oth-JSpec/). –

0

на самом деле не имеет значения, как это делает tomcat. возможно new Thread(name). то, что вы действительно спрашиваете, это то, что видно для разных потоков. чтобы узнать больше о Google для «параллелизма», «видимости потоков», «модели памяти Java» или «Happened-before».

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

+0

Хорошая точка. На самом деле я спрашиваю, создает ли Tomcat новый экземпляр при нерестах нити или нет. Ответ Сотириоса довольно ясен. – qweruiop

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