Istruzione lock in C#

In questo tutorial, discuteremo l’istruzione lock in C#.

l’istruzione lock in C

L’istruzione lock(obj) specifica che la seguente sezione di codice non è accessibile da più di un thread contemporaneamente in C#. Il parametro obj all’interno dell’istruzione lock(obj) è un’istanza della classe object. L’istruzione lock(obj) fornisce un modo efficiente di gestire i thread in C#. Se un thread accede al codice all’interno del lock(obj) e un altro thread vuole accedere allo stesso codice, il secondo thread dovrà attendere che il primo thread lo esegua. L’istruzione lock(obj) garantisce l’esecuzione sequenziale della sezione di codice specificata. Per dimostrare questo fenomeno, ti mostreremo prima il risultato del codice senza alcuna gestione dei thread con l’istruzione lock(obj).

using System;
using System.Threading;

namespace lock_statement
{
    class Program
    {
        static readonly object lockname = new object();
        static void display()
        {
                for (int a = 1; a <= 3; a++)
                {
                    Console.WriteLine("The value to be printed is: {0}", a);
                }
        }
        static void Main(string[] args)
        {
            Thread firstthread = new Thread(display);
            Thread secondthread = new Thread(display);
            firstthread.Start();
            secondthread.Start();
        }
    }
}

Produzione:

The value to be printed is: 1
The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3
The value to be printed is: 2
The value to be printed is: 3

Come possiamo vedere, i thread firstthread e secondthread accedono entrambi al codice all’interno del ciclo in modo casuale. Ti mostreremo il risultato del codice con la gestione dei thread con l’istruzione lock(obj).

using System;
using System.Threading;

namespace lock_statement
{
    class Program
    {
        static readonly object lockname = new object();
        static void display()
        {
            lock (lockname)
            {
                for (int a = 1; a <= 3; a++)
                {
                    Console.WriteLine("The value to be printed is: {0}", a);
                }
            }
        }
        static void Main(string[] args)
        {
            Thread firstthread = new Thread(display);
            Thread secondthread = new Thread(display);
            firstthread.Start();
            secondthread.Start();
        }
    }
}

Produzione:

The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3
The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3

Questa volta, al codice all’interno del ciclo si accede in sequenza sia da firstthread che da secondthread. Possiamo inserire del codice in cui modificare il valore di una variabile all’interno di un’istruzione lock(obj) per prevenire qualsiasi perdita di dati.

Articolo correlato - Csharp Thread

  • Attendi la fine di un thread in C#