Istruzione lock in C#

Muhammad Maisam Abbas 16 febbraio 2024
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 bucle 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 bucle 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.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Articolo correlato - Csharp Thread