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:
- a reference to Me: if the instance
is publicly accessible, the lock might be shared
- a Type object: if the type class is publicly accessible, the lock might
be shared
- a String literal or
instance: if any other part of the program uses the same string, the lock is shared because of interning