Bonne façon d'utiliser SyncLock (en général)

C'est un suivi à un question précédente concernant le verrouillage de deux List(Of T) des objets. La réponse a été utile, mais m'a laissé avec une autre question.

Supposons que j'ai une fonction comme ceci:

Public Function ListWork() As Integer
  List1.Clear()
  ..Some other work which does not modify List1..
  List1.AddRange(SomeArray)
  ..Some more work that does not involve List1..
  Return List1.Count
End Function

qui réside dans une classe qui déclare List1. Dans un environnement multithread, je comprends maintenant que je devrais avoir une privé de verrouillage d'un objet pour la liste 1 et de verrouillage List1 à chaque fois qu'il est modifié ou énumérés. Ma question est, dois-je faire ceci:

Private List1Lock As New Object
Public Function ListWork() As Integer
  SyncLock List1Lock
    List1.Clear()
  End SyncLock
  ..Some other work which does not modify List1..
  SyncLock List1Lock
    List1.AddRange(SomeArray)
  End SyncLock
  ..Some more work that does not involve List1..
  SyncLock List1Lock
    Dim list1Count As Integer = List1.Count
  End SyncLock
  Return list1Count
End Function

ou ceci:

Private List1Lock As New Object
Public Function ListWork() As Integer
  SyncLock List1Lock
    List1.Clear()
    ..Some other work which does not modify List1..
    List1.AddRange(SomeArray)
    ..Some more work that does not involve List1..
    Dim list1Count As Integer = List1.Count
  End SyncLock
  Return list1Count
End Function

Je suppose que l'exemple précédent est-elle optimale?