Поскольку объекты String
неизменяемы, только ссылка изменяется такими операторами, как =
и +=
. Следовательно, volatile безопасен для String
, поскольку он применяется к самой ссылке. Это относится и к другим неизменяемым объектам, так же как и к примитивам.
Уточнение:
+=
сам по себе не является потокобезопасным даже для изменчивого String
, так как он не atomi c и состоит из чтения с последующей записью. Если что-то влияет на объект String
между чтением и записью, это может привести к неожиданным результатам. Хотя результирующий String
все еще будет действительным, он может иметь неожиданное значение. В частности, некоторые изменения могут «перезаписать» другие изменения. Например, если у вас есть String
со значением "Stack "
, и один поток пытается добавить "Overflow"
, а другой пытается добавить "Exchange"
, есть вероятность, что будет применено только одно изменение. Это относится и к примитивам. Если вам интересно, более подробную информацию об этой конкретной проблеме (в основном в контексте примитивов) можно найти здесь .