Почему метод конструктора класса String с параметром StringBuffer использует блок синхронизации, а конструктор с StringBuilder - нет? - PullRequest
3 голосов
/ 23 февраля 2020

Почему метод конструктора класса String с параметром StringBuffer использует блок синхронизации, а конструктор с StringBuilder - нет?

public String(StringBuffer buffer) {
    synchronized(buffer) {
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}

public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

StringBuffer предназначен для многопоточной обработки.

Но даже при таком дизайне все еще возможно, что между вызовами buffer.getValue() и buffer.length() может быть попытан изменить какой-то другой поток для изменения buffer. Это означает, что getValue() будет отражать состояние до этой модификации, но length() состояние после этой модификации.

Синхронизация обоих вызовов на объекте буфера через synchronized(buffer) внутри конструктора String предотвращает доступ других потоков к синхронизированным методам этого buffer. Особенно это относится к методам, способным модифицировать buffer, поэтому сделать это невозможно в середине обработки его конструктором String.

2 голосов
/ 23 февраля 2020

Поскольку разница StringBuilder по сравнению с StringBuffer заключается в том, что StringBuffer является потокобезопасным, а StringBuilder - нет. Обратите внимание, что безопасность потоков сопровождается снижением производительности, поэтому StringBuffer следует использовать только при многопоточном использовании.

Из официальной документации :

String буферы безопасны для использования несколькими потоками. При необходимости методы синхронизируются, поэтому все операции в любом конкретном экземпляре ведут себя так, как будто они происходят в некотором последовательном порядке, который согласуется с порядком вызовов методов, выполняемых каждым из отдельных задействованных потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...