Я читал некоторые посты и статьи о том, что мы не должны объявлять java-объекты как volatile, потому что в результате только ссылка становится volatile. Вот некоторые примеры:

ссылка - 1 ссылка - 2 ссылка - 3

Сонар предлагает, что «Непримитивные поля не должны быть« изменчивыми »», однако, это также предполагает, что описанная проблема относится к изменяемым объектам. не'.

Мой вопрос: безопасно ли объявлять строку Java как изменчивую?

4
jaros 6 Май 2020 в 09:21

2 ответа

Поскольку объекты String являются неизменяемыми, только ссылка изменяется такими операторами, как = и +=. Следовательно, volatile безопасна для String, так как она применяется к самой ссылке. Это относится и к другим неизменным объектам, так же, как и к примитивам.

Разъяснение :

Сам по себе += не является потокобезопасным даже для энергозависимого String, поскольку он не атомарный и состоит из чтения, за которым следует запись. Если что-то влияет на объект String между чтением и записью, это может привести к неожиданным результатам. Это относится и к примитивам. Если вам интересно, более подробную информацию об этой конкретной проблеме (в основном в контексте примитивов) можно найти здесь.

1
Evan Bailey 6 Май 2020 в 07:07

Java String является окончательным классом, неизменным и поточно-ориентированным.
Не существует среднего состояния для String, которое не будет путать в многопоточных случаях с lock или synchronize. Там нет необходимости делать это.

-1
PatrickChen 6 Май 2020 в 07:10