Generally code samples use locks this way:
static readonly object lockForWorkingWithSharedObject = new object();
lock(lockForWorkingWithSharedObject)
{
// do something with shared object
}
This way we need many locks in a large class. Is it good practice to use the shared object itself as the synchronization object ?
// of course here sharedObject is a reference type
lock(sharedObject)
{
// do something with sharedObject
}