C# Language serratura


Esempio

lock fornisce thread-safety per un blocco di codice, in modo che sia accessibile da un solo thread all'interno dello stesso processo. Esempio:

private static object _lockObj = new object();
static void Main(string[] args)
{
    Task.Run(() => TaskWork());
    Task.Run(() => TaskWork());
    Task.Run(() => TaskWork());

    Console.ReadKey();
}

private static void TaskWork()
{
    lock(_lockObj)
    {
        Console.WriteLine("Entered");

        Task.Delay(3000);
        Console.WriteLine("Done Delaying");

        // Access shared resources safely

        Console.WriteLine("Leaving");
    }   
}

Output:

Entered
Done Delaying
Leaving
Entered
Done Delaying
Leaving
Entered
Done Delaying
Leaving

Casi d'uso:

Ogni volta che si dispone di un blocco di codice che potrebbe produrre effetti collaterali se eseguito da più thread contemporaneamente. La parola chiave di blocco insieme a un oggetto di sincronizzazione condiviso ( _objLock nell'esempio) può essere utilizzata per impedirlo.

Si noti che _objLock non può essere null e più thread che eseguono il codice devono utilizzare la stessa istanza di oggetto (rendendola un campo static o utilizzando la stessa istanza di classe per entrambi i thread)

Dal lato del compilatore, la parola chiave lock è uno zucchero sintattico che viene sostituito da Monitor.Enter(_lockObj); e Monitor.Exit(_lockObj); . Quindi se sostituisci il blocco circondando il blocco di codice con questi due metodi, otterresti gli stessi risultati. È possibile visualizzare il codice effettivo in zucchero sintattico in C # - esempio di blocco