Многопоточность и сервелеты

Контейнер сервлетов будет иметь несколько потоков выполнения, распределяемых согласно запросам клиентов. Вероятна ситуация, когда два клиента одновременно вызовут методы doGet() или doPost(). Метод service() должен быть написан с учетом вопросов многопоточности. Любой доступ к разделяемым ресурсам, которыми могут быть файлы, объекты, необходимо защитить ключевым словом synchronized. Ниже приведен пример посимвольного вывода строки сервлетом с паузой между выводом символов в 500 миллисекунд, что позволяет другим клиентам, вызвавшим сервлет, успеть вклиниться в процесс вывода при отсутствии синхронизации.

/* пример # 6 : доступ к синхронизированным ресурсам :

ServletSynchronization.java */

package chapt18;

import java.io.*;

import javax.servlet.ServletException;

import javax.servlet.http.*;

public class ServletSynchronization extends HttpServlet {

// синхронизируемый объект

private StringBuffer locked = new StringBuffer();

protected void doGet(HttpServletRequest req,

HttpServletResponse res)

throws ServletException, IOException {

performTask(req, res);

}

private void performTask(HttpServletRequest req,

HttpServletResponse res)

throws ServletException, IOException {

try {

Writer out = res.getWriter();

out.write(

"<HTML><HEAD>"

+ "<TITLE>SynchronizationDemo</TITLE>"

+ "</HEAD><BODY>");

out.write(createString());

out.write("</BODY></HTML>");

out.flush();

out.close();

} catch (IOException e) {

throw new RuntimeException(

"Failed to handle request: " + e);

}

}

protected String createString() {

// оригинал строки

final String SYNCHRO = "SYNCHRONIZATION";

synchronized (locked) {

try {

for (int i = 0; i < SYNCHRO.length(); i++) {

locked.append(SYNCHRO.charAt(i));

Thread.sleep(500);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

String result = locked.toString();

locked.delete(0, SYNCHRO.length() – 1);

return result;

}

}

}

Результаты работы сервлета при наличии и отсутствии синхронизации представлены на рисунках.

clip_image002

Рис. 18.3. Результат работы сервлета Synchronization
с блоком синхронизации

clip_image004

clip_image006

Рис. 18.4. Результат работы сервлета Synchronization
без синхронизации

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

1 комментарий »

 
  • whatsoever says:

    locked.delete(0, SYNCHRO.length() – 1) не удалит последний символ ‘N’ в “SYNCHRONIZATION”, так как вторым аргументом метода delete() является номер позиции, до которой нужно удалить символы (невключительно (exclusive)!).

 

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100