La différence entre le manuel de verrouillage et de méthodes Synchronisées

Quelle est la différence entre ceci:

internal class MyClass
{
    private readonly object _syncRoot = new Object();

    public void DoSomething() 
    {
        lock(_syncRoot)
        {
            ...
        }
    }

    public void DoSomethingElse() 
    {
        lock(_syncRoot)
        {
            ...
        }
    }
}

et ce:

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

    [MethodImpl(MethodImplOptions.Synchronized)]
    public void DoSomethingElse() 
    {
        ...
    }
}

La seule différence que je vois, c'est que la première approche des verrous sur certains député alors que la deuxième approche serrures sur l'instance elle-même (donc il doit verrouiller tout le reste dans l'instance). Est-il des conseils généraux de l'approche à utiliser? J'ai actuellement deux classes ayant un objet similaire dans notre projet, chacun écrit avec une approche différente.

Edit:

Peut-être une question de plus. Est-ce:

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

exactement les mêmes comme ceci:

internal class MyClass
{
    public void DoSomething() 
    {
        lock(this) 
        {
            ...
        }
    }
}
  • découvrez stackoverflow.com/questions/541194/...
  • Grand. Ma question est presque le double.
  • Je voudrais afficher l'attribut de la forme polie "suggestion" pour le compilateur. Je ne suis pas sûr si elles sont liées par la norme à suivre. Alors que explicitement à l'aide d'un lock déclaration applique une compilation exigence.
  • Une suggestion polie n'est pas très utilisable/fiable, serait-il?
  • Je dis simplement que je ne me souviens pas qu'il soit verrouillé par une norme en tant que "doit être mise en œuvre" par la conformité de la CLR.