Являются ли контроллеры Spring потокобезопасными?

Я пишу метод частной утилиты в контроллере Spring.

Мне нужно использовать либо StringBuffer, либо StringBuilder. Первый является потокобезопасным, второй — нет, но последний намного быстрее.

В основном это выглядит так:

private String buildTextToDisplay() {
    StringBuffer sb = new StringBuffer();
    sb.append( ... );
    return sb.toString();
}

Очевидно, я не хочу, чтобы два сеанса вызывали это одновременно и возвращали мусор.


person EdgeCase    schedule 26.08.2012    source источник
comment
может быть полезно: Как программно доказать, что StringBuilder не является потокобезопасным?   -  person Andrew Tobilko    schedule 19.02.2018


Ответы (3)


Поскольку sb является локальной переменной, она не должна быть потокобезопасной. (Каждый поток будет иметь свою собственную ссылку на уникальный StringBuilder, верно?)

person aioobe    schedule 26.08.2012

Потокобезопасность StringBuffer полезна, когда она используется как переменная-член класса. Но если это локальная переменная, то StringBuilder лучше, потому что для локальной переменной нет концепции потокобезопасности.

person Vikdor    schedule 26.08.2012

Вам нужно будет использовать конструктор очень специфическим образом, чтобы заметить разницу в скорости между StringBuilder и StringBuffer. В 99% вариантов использования нет заметной разницы, а с современными JIT это на 100% связано с исключением блокировки.

Но, как замечают другие, вы можете использовать StringBuilder в своем случае.

person Marko Topolnik    schedule 26.08.2012