Прочитав это - Что означает "синхронизированный"? я все еще не мог понять, почему StringBuffer быть медленнее, чем StringBuilder в потокобезопасной среде. Какую дополнительную трудоемкую работу должен выполнять StringBuffer, что делает его медленнее?
StringBuffer синхронизирован (или потокобезопасен), а StringBuilder — нет. Почему это замедляет работу методов StringBuffer?
Ответы (3)
Существуют небольшие накладные расходы на получение и освобождение даже неоспариваемой блокировки и отключение блокировки. не будет работать в StringBuffer
, даже если большинство экземпляров не используются в нескольких потоках, потому что экземпляр может быть.
См. http://book.javanb.com/java-threads-3rd/jthreads3-CHP-5-SECT-1.html для описания того, что должна делать виртуальная машина при получении и снятии блокировок.
Убедитесь, что все работает синхронно. Или, точнее, несинхронно. Синхронизация вызова метода означает, что два разных вызова этого метода (для этого объекта, если он не является статическим) должны по очереди вводить метод. Поток B не может войти в метод synchMeth, пока поток A (уже в методе) не завершится.
Проверка того, был ли заблокирован синхронизированный блок и кем, занимает дополнительное время.
Прочтите это в JavaDoc
Класс StringBuilder предоставляет API, совместимый со StringBuffer, но без гарантии синхронизации. Этот класс предназначен для использования в качестве замены StringBuffer в тех местах, где строковый буфер использовался одним потоком (как это обычно бывает). По возможности рекомендуется использовать этот класс вместо StringBuffer, поскольку в большинстве реализаций он будет быстрее.
Вы должны прочитать эту статью о сравнении производительности StringBuffer и StringBuilder< /а>
Начиная с выпуска JDK 5, этот класс был дополнен эквивалентным классом, предназначенным для использования одним потоком, {StringBuilder}. Обычно следует использовать класс StringBuilder, а не этот, так как он поддерживает все те же операции, но быстрее, так как не выполняет синхронизацию.
Дополнительная полезная ссылка: Разница между классами StringBuffer и StringBuilder.