В производственном веб-приложении мои коллеги-программисты везде использовали StringBuffer. Сейчас я занимаюсь разработкой и исправлением приложений. После прочтения StringBuilder и StringBuffer я решил заменить весь код StringBuffer на StringBuilder, потому что нам не нужна безопасность потоков в наших компонентах данных.
Например: (В каждом бине данных я вижу использование StringBuffer)
@Override
public String toString() {
StringBuffer sb = new StringBuffer();// replace it from StringBuilder
sb.append(" ABCD : ").append(abcd);
sb.append(", EFGH : ").append(efgh);
sb.append(", IJKL : ").append(ijkl);
}
Мы создаем отдельные компоненты данных для каждой сессии / запроса. Сеанс используется одним пользователем, другой пользователь не может получить к нему доступ.
Должен ли я рассмотреть другие вопросы перед миграцией?
Если существует один поток (нет ожидающих потоков / новый поток не будет искать блокировку объекта), он работает одинаково с StringBuffer или StringBuilder. Я знаю, что в случае StringBuffer требуется время для блокировки объекта, но я хочу знать, есть ли между ними разница в производительности, кроме удержания / снятия блокировки объекта.
StringBuffer
. Я никогда не видел такого кода, но я почти уверен, что это плохой дизайн с точки зрения многопоточности. Поскольку я думаю, что синхронизация потоков по StringBuffer
интерфейсу - плохая идея, я думаю, что этот класс не должен существовать, и его всегда следует использовать StringBuilder
. Как уже упоминалось, StringBuffer
существует по историческим причинам.
sb
в качестве локальной переменной, как в вашем примере, тогда безопасность потоков вообще не имеет значения. Даже если в метод одновременно войдет тысяча потоков, у каждого будет свой стек вызовов со своими локальными переменными. StringBuilders никогда не будут мешать друг другу.