Shared resources should not be used for locking as it increases the chance of deadlocks. Any other thread could acquire (or attempt to acquire) the same lock for another unrelated purpose.

Instead, a dedicated object instance should be used for each shared resource, to avoid deadlocks or lock contention.

The following objects are considered as shared resources:

Noncompliant Code Example

public void MyLockingMethod()
{
    lock (this) // Noncompliant
    {
        // ...
    }
}

Compliant Solution

private readonly object lockObj = new object();

public void MyLockingMethod()
{
    lock (lockObj)
    {
        // ...
    }
}

See

Microsoft Documentation: Managed Threading Best Practices