Ну, в основном это будет зависеть от языка, который вы не указали, но, как правило, если код не касается ресурса, к которому также может обращаться другой поток, его не нужно защищать.
В этом случае, кажется, единственное, чего касались, это локальная переменная i
, которая будет иметь отдельную копию для каждого вызова функции. Другими словами, он не нуждается в защите.
Конечно, можно утверждать, что консоль также является ресурсом и может нуждаться в защите, если, например, вы не хотите, чтобы строки мешали друг другу (синхронизировать запись), или хотели, чтобы все сто строк выводились как единичный блок (синхронизировать весь цикл for).
Но это не защитит консоль , только блок кода, который ее использует. Другие потоки все еще смогут писать в консоль, не используя этот метод.
Итог, я не думаю, что вам нужен синхронизатор во втором методе.
Этот раздел ниже не имеет значения, если вы используете SyncLock в VB.Net (как сейчас кажется). Язык гарантирует, что блокировка снята независимо от того, как вы покидаете блок. Я оставлю это в истерических целях.
Я бы был немного обеспокоенным вашим размещением синхронизатора в первом методе, особенно если оператор return был передачей управления обратно вызывающей стороне (и синхронизация не автоматически разблокировалась в области видимости менять). Похоже, вы можете вернуться без разблокировки, что было бы катастрофой. Я думаю, что более подходящим будет следующее:
Public Shared Function GetList() As List(Of Integer)
SyncLock lock
If list Is Nothing Then
list = New List(Of Integer)
End If
End SyncLock
Return list
End Function