StringBuffer синхронизирован (или потокобезопасен), а StringBuilder — нет. Почему это замедляет работу методов StringBuffer?

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


person Shailesh Tainwala    schedule 09.06.2011    source источник
comment
Вы сами отвечаете на свой вопрос. StringBuffer синхронизирован, поэтому он должен выполнять больше работы, чем другой. Что еще хуже в этом случае, так это то, что в 99% случаев он не нужен.   -  person Peter Lawrey    schedule 09.06.2011
comment
... и ветка, на которую он ссылается, в значительной степени объясняет, почему синхронизация стоит немного дороже, чем код без синхронизации.   -  person Kaj    schedule 09.06.2011
comment
Поскольку в предыдущем вопросе основное внимание уделялось не тому, какую дополнительную работу выполняет синхронизированный метод, мне пришлось предположить, что может быть больше, чем то, что было упомянуто в ответах (чтобы оправдать очень яростный «Не используйте StringBuffer, если вам не нужны операторы Synchronization» я сталкивался). Выбранный ниже ответ дает необходимую мне информацию. Думаю вопрос оправдан.   -  person Shailesh Tainwala    schedule 10.06.2011
comment
может быть интересно: Как программно доказать, что StringBuilder не является потокобезопасным?   -  person Andrew Tobilko    schedule 19.02.2018


Ответы (3)


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

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

person Mike Samuel    schedule 09.06.2011

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

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

person Atreys    schedule 09.06.2011

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

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

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

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

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

person Saurabh Gokhale    schedule 09.06.2011