Установка строки является атомарной операцией, то есть вы получите либо новую, либо старую строку, вы никогда не получите мусор.
Если вы делаете какую-то работу, например,
obj.SampleProperty = "Dear " + firstName + " " + lastName;
тогда конкатенация строк происходит перед вызовом set, поэтому sampleField всегда будет либо новой строкой, либо старой.
Если, однако, ваш код конкатенации строк самореферентен, например
obj.SampleProperty += obj.SampleProperty + "a";
и еще где у вас в другом потоке
obj.SampleProperty = "Initial String Value";
Тогда вам нужен замок.
Считайте, что вы работаете с int. Если вы присваиваете int и любое значение, полученное из int, является действительным, вам не нужно его блокировать.
Однако, если int ведет подсчет количества виджетов, обработанных двумя или более потоками, для точного подсчета необходимо заблокировать int.
То же самое относится и к строкам.
У меня такое чувство, что я не очень хорошо объяснил это, надеюсь, это поможет.
Спасибо
BW