«StringBuffer синхронизирован (или поточно-ориентирован), а StringBuilder - нет», почему это замедляет методы StringBuffer? - PullRequest
3 голосов
/ 09 июня 2011

Прочитав это - Что означает «синхронизированный»? Я все еще не мог понять, почему StringBuffer будет медленнее, чем StringBuilder в поточно-ориентированной среде.Какую дополнительную трудоемкую работу должен выполнить StringBuffer, чтобы замедлить работу?

Ответы [ 3 ]

7 голосов
/ 09 июня 2011

Существуют небольшие накладные расходы на получение и освобождение даже неконтролируемой блокировки, и elision lock не будет работать в StringBuffer, даже если большинство экземпляров не используются в многопоточном режиме, поскольку экземпляр может быть.

См. http://book.javanb.com/java-threads-3rd/jthreads3-CHP-5-SECT-1.html для описания того, что виртуальная машина должна делать при получении и снятии блокировок.

2 голосов
/ 09 июня 2011

Прочтите это из JavaDoc

Класс StringBuilder предоставляет API совместим с StringBuffer, но с нет гарантии синхронизации. это класс предназначен для использования в качестве раскрывающегося замена для StringBuffer местами где использовался строковый буфер одним потоком (как обычно дело). Где это возможно, это Рекомендуется использовать этот класс в предпочтение StringBuffer, как это будет Быстрее при большинстве реализаций.

Вы должны прочитать эту статью на Сравнение производительности StringBuffer и StringBuilder

Начиная с версии JDK 5 этот класс был дополнен эквивалентным класс предназначен для использования одним нить, {StringBuilder}. Класс StringBuilder должен обычно быть предпочтительным к этому, так как он поддерживает все те же операции но это быстрее, так как он не выполняет синхронизации.

Дополнительная полезная ссылка: Разница между классами StringBuffer и StringBuilder.

2 голосов
/ 09 июня 2011

Убедитесь, что все работает синхронно.Или, если говорить точнее, несинхронно.Синхронизация вызова метода означает, что два разных вызова этого метода (для этого объекта, если он не является статическим) должны по очереди входить в метод.Поток B не может войти в метод synchMeth до тех пор, пока не завершится поток A (уже в методе).

Проверка того, заблокирован ли синхронизированный блок или нет, и кем он занимает дополнительное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...