Разница между ручной блокировкой и синхронизированными методами

Есть ли разница между этим:

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() 
    {
        ...
    }
}

Единственное различие, которое я вижу, состоит в том, что первый подход блокирует какой-то закрытый член, тогда как второй подход блокирует сам экземпляр (поэтому он должен блокировать все остальное в экземпляре). Есть ли какой-нибудь общий совет, какой подход использовать? В настоящее время я нашел в нашем проекте два класса с похожими целями, каждый из которых был написан с различным подходом.

Изменить:

Возможно, еще один вопрос. Это:

internal class MyClass
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    public void DoSomething() 
    {
        ...
    }
}

точно так же, как это:

internal class MyClass
{
    public void DoSomething() 
    {
        lock(this) 
        {
            ...
        }
    }
}
54
задан Ladislav Mrnka 26 May 2011 в 03:24
поделиться