У виробничому веб-додатку мої колеги-програмісти всюди використовували 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 ніколи не заважатимуть один одному.