Зависит от того, что вы подразумеваете под обновлено .
Если вы имеете в виду, что ссылка изменена, то есть _nameCache = newvalue;
, то, как сказал Марк, да, вы должны (с той же блокировкой) и, нет, вы не получите условия гонки.
Если, однако, вы имеете в виду, что элементы добавляются и удаляются в экземпляр, на который ссылается _nameCache, вам не нужно блокировать возврат (так как сама ссылка никогда не изменяется). Однако вам нужно быть осторожным при чтении коллекции после ее извлечения - в идеале вам следует использовать ту же блокировку перед вызовом любого из ее методов.
Либо так, либо вы можете использовать модель событий, чтобы получать уведомления о новых элементах и т. Д., Если все, что вам нужно сделать, это отслеживать изменения - поскольку события будут генерироваться в потоке, который в данный момент заблокирован для коллекции. 1010 *
Если это не подходит (потому что вы всегда получаете элементы через индексатор или что-то еще), то вы всегда можете вернуть копию ObservableCollection через это свойство - т.е. return new ObservableCollection<string>(_nameCache);
. Это сделает возвращаемое значение свойства недолговечным, но оставит любого вызывающего абонента свободным для перечисления и индексации, не опасаясь искажения состояния в других потоках.