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