Есть ли разница между этим:
internal class MyClass
{
    private readonly object _syncRoot = new Object();
    public void DoSomething() 
    {
        lock(_syncRoot)
        {
            ...
        }
    }
    public void DoSomethingElse() 
    {
        lock(_syncRoot)
        {
            ...
        }
    }
}
и это:
internal class MyClass
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    public void DoSomething() 
    {
        ...
    }
    [MethodImpl(MethodImplOptions.Synchronized)]
    public void DoSomethingElse() 
    {
        ...
    }
}
Единственное различие, которое я вижу, это то, что первый подход блокируется каким-то частным членом, тогда как второй подход блокируется самим экземпляром (поэтому он должен блокировать все остальное в экземпляре). Есть ли общий совет, который подходит для использования? В настоящее время я нашел два класса с аналогичной целью в нашем проекте, каждый из которых написан с различным подходом.
Edit:
Возможно, еще один вопрос. Это:
internal class MyClass
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    public void DoSomething() 
    {
        ...
    }
}
точно так же, как это:
internal class MyClass
{
    public void DoSomething() 
    {
        lock(this) 
        {
            ...
        }
    }
}