#java #multithreading #servlets #synchronized
#java #многопоточность #сервлеты #синхронизировано
Вопрос:
Я знаю, что это простой вопрос, но я как-то запутался.
Если я хорошо понимаю, простыми словами, когда запрос поступает на веб-сервер, он создает поток для каждого запроса к какому-либо сервлету.
Учтите, что у нас есть следующий код в MyServlet (я не учел обработку исключений и тому подобное):
synchronized protected void doGet( ... ...){
PrintWritet pw=response.getWriter();
String param=request.getParameter("p");
if(param.equals("a")){
wait();
}else{
notifyAll();
}
pw.write("Hello!");
}
Я ожидаю, что этот сервлет застрянет, потому что первый поток (с параметром = a), который вводит этот метод, будет ждать вечно, потому что любой другой будущий поток застрянет перед doGet из-за ключевого слова synchronized, и из-за этого notifyAll никогда не будет выполнен.
Теперь, если я открою новую вкладку в браузере и нажму /MyServlet?p = a, браузер ожидает 127.0.0.1… После этого я открываю новую вкладку и нажимаю /MyServlet?p=b (или все, что есть!=a) первая вкладка освобождается и распечатывается сообщение «Привет!».
Это означает, что второй поток вошел в doGet и выполнил notifyAll.
Почему это происходит? Что я пропустил?
Ответ №1:
Потому что wait()
снимает блокировку, ранее полученную при вводе synchronized
блока. Из javadoc для Object.wait
:
Поток освобождает права собственности на этот монитор и ожидает, пока другой поток не уведомит потоки, ожидающие на мониторе этого объекта пробуждения, либо посредством вызова метода notify, либо метода notifyAll. Затем поток ожидает, пока он не сможет повторно получить право собственности на монитор, и возобновляет выполнение.
Итак, ваш первый запрос получает блокировку, вводит doGet
метод и вызывает wait
(который снимает блокировку и ожидает). Второй запрос получает блокировку, вводит doGet
и вызывает notifyAll
, который запускает поток первого запроса.
Крайне важно, чтобы вы внимательно прочитали документацию по таким методам, как wait
и notify
/ notifyAll
, прежде чем использовать их, иначе у вас возникнут проблемы.