Когда метод синхронизирован, можем ли мы использовать StringBuilder вместо StringBuffer?

У меня есть метод, который синхронизируется. Я хочу использовать строковый буфер для формирования длинной конкатенированной строки. Я знаю, что и StringBuffer, и StringBuilder могут выполнять эту работу. В то же время я думаю, что StringBuilder лучше, так как он не будет нести никаких дополнительных затрат на синхронизацию, поскольку метод уже делает это.

Что ты говоришь?


person Pankaj Dwivedi    schedule 02.05.2014    source источник
comment
опубликовать метод; Подозреваю, что и без синхронизации все будет в порядке.   -  person chrylis -cautiouslyoptimistic-    schedule 02.05.2014
comment
Если ваш StringBuilder является локальной переменной метода, все будет в порядке, даже если сам метод не синхронизирован.   -  person anonymous    schedule 02.05.2014
comment
Да, я согласен с тем, что локальная переменная защищена от проблем параллелизма, если только не происходит что-то действительно тонкое, что нельзя предсказать заранее.   -  person Pankaj Dwivedi    schedule 02.05.2014
comment
StringBuilder также лучше, поскольку у вас есть явная синхронизация. Очень легко неправильно использовать StringBuffer, предполагая, что вам не нужно беспокоиться о безопасности потоков, если вы это сделаете. vanillajava.blogspot.co.uk/2013/ 04/   -  person Peter Lawrey    schedule 02.05.2014


Ответы (3)


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

В вашем случае, если метод, в котором находится StringBuilder/Buffer, равен synchronized, только один поток должен иметь к нему доступ в любой момент времени, поэтому StringBuilder должно быть достаточно.

person awksp    schedule 02.05.2014

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

Самостоятельно управлять потокобезопасностью всегда лучше, потому что иногда у вас есть очень маленький критический раздел в вашем коде, поэтому method level Synchronization не требуется, достаточно только block level, но в таких методах, как StringBuffer, иногда синхронизация требует больших затрат, но в любом случае это до вашей потребности.

person JavaLearner    schedule 02.05.2014

Поскольку ваш объект StringBuilder не используется совместно с другими потоками, вы можете использовать это.

person niiraj874u    schedule 02.05.2014