The instance passed to the SyncLock statement
should be a dedicated private field.
If the instance representing an exclusively acquired lock is publicly accessible, another thread in another part of the program could accidentally attempt to acquire the same lock. This increases the likelihood of deadlocks.
For example, a string should never be used for locking. When a string is interned by the runtime, it can be shared by multiple threads, breaking the
locking mechanism.
Instead, a dedicated private Lock object
instance (or object instance, for frameworks before .Net 9) should be used for locking. This minimizes access to the lock instance and
therefore prevents accidential lock sharing.
The following objects are considered potentially prone to accidental lock sharing:
Public Sub MyLockingMethod()
SyncLock Me 'Noncompliant
' ...
End SyncLock
End Sub
Private lockObj As New Object()
Public Sub MyLockingMethod()
SyncLock lockObj
' ...
End SyncLock
End Sub