Instrução block em C#

Muhammad Maisam Abbas 12 outubro 2023
Instrução block em C#

Neste tutorial, discutiremos a instrução lock em C#.

a instrução lock em C#

A instrução lock(obj) especifica que a seção de código a seguir não pode ser acessada por mais de um thread ao mesmo tempo em C#. O parâmetro obj dentro da instrução lock(obj) é uma instância da classe object. A instrução lock(obj) fornece uma maneira eficiente de gerenciar threads em C#. Se o código dentro do lock(obj) for acessado por uma thread e outra thread quiser acessar o mesmo código, a segunda thread terá que esperar pela primeira thread para executá-lo. A instrução lock(obj) garante a execução sequencial da seção de código especificada. Para demonstrar esse fenômeno, primeiro mostraremos o resultado do código sem qualquer gerenciamento de thread com a instrução 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();
    }
  }
}

Resultado:

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

Como podemos ver, os threads firstthread e secondthread acessam o código dentro do loop aleatoriamente. Mostraremos o resultado do código com gerenciamento de thread com a instrução 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();
    }
  }
}

Resultado:

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

Desta vez, o código dentro do loop é acessado sequencialmente por firstthread e secondthread. Podemos colocar o código no qual alteramos o valor de uma variável dentro de uma instrução lock(obj) para evitar qualquer perda de dados.

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

Artigo relacionado - Csharp Thread