2013-07-29 4 views
2

Я реализует свой собственный фильтр:StringBuffer или StringBuilder в методе doFilter сервлета?

public class MyFilter implements javax.servlet.Filter 

Какой я должен использовать в этом doFilter метод - StringBuffer или StringBuilder?

Я хотел бы использовать его таким образом:

StringBuffer stringBuffer = new StringBuffer(); 
stringBuffer.append(MY_CODE_HERE); 
response.sendRedirect(stringBuffer.toString()); 

или ...

StringBuilder stringBuilder = new StringBuilder(); 
stringBuilder.append(MY_CODE_HERE); 
response.sendRedirect(stringBuilder.toString()); 

Я знаю, что StringBuffer потокобезопасен, но Бы StringBuilder будет достаточно?

+0

http://stackoverflow.com/questions/12961254/stringbuffer-stringbuilder-when-to-use?lq=1 – kosa

+1

Как предлагает Javadoc, вы всегда должны использовать StringBuilder если сможешь.Примечание. StringBuffer является только потокобезопасным, если вы выполняете только одну операцию на нем, он не защищен потоком для нескольких операций, что делает его довольно бесполезным IMHO. –

+0

Это не похоже на дубликат вообще - это относится к последствиям «StringBuffer» в фильтре, в отличие от того, что разница между двумя фактически * есть *. – Makoto

ответ

7

Локальные переменные являются потокобезопасными, а переменные, объявленные внутри метода doFilter(), будут потокобезопасными. Используйте StringBuilder для вашей цели, так как вы не должны излишне брать накладные расходы на синхронизацию, используемую в StringBuffer.

Кроме того, объекты запроса и ответа на Servlet создаются заново для каждого нового запроса и ответа, поэтому по своей природе они являются потокобезопасными. Метод doFilter() будет выполняться в отдельных потоках для каждого запроса.

Рекомендуемая литература:

  1. Why are local variables thread safe in Java.
  2. StringBuilder and StringBuffer in Java
  3. servlet-filters tag wiki
3

Поскольку это будет локальная переменная и не разделяется нитями, можно использовать StringBuilder.

1

StringBuilder является лучшим выбором, поскольку это скорее из-за его несинхронизированный характер. ServletFilter doFilter для каждого запроса запускается в своем потоке, поэтому вам не нужна синхронизированная структура данных. И если это просто локальная varibale, то выбор StringBuilder.

0

До тех пор, пока он находится в методе doFilter(), его thread-safe и request scoped. Таким образом, StringBuilder - очевидный выбор.

Ofcourse, если нет несколько потоков нереста в этом методе, изменяющих его одновременно :)

1

StringBuilder разработан как замена для StringBuffer без synchronization.

Просто используйте StringBuilder, если вы действительно не пытаетесь разделить буфер между потоками. StringBuilder - это несинхронизированный родственник исходного синхронизированного класса StringBuffer.

В вашем случае StringBuilder имеет прекрасный смысл. Даже в другом случае рассмотрите метод синхронизации, используя StringBuffer

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