Instrução SyncLock

Obtém um bloqueio exclusivo para um bloco de declaração antes de executar o bloco.

SyncLock lockobject
    [ block ]
End SyncLock

Partes

  • lockobject
    Obrigatório.Expressão que avalia como uma referência de objeto.

  • block
    Opcional.Bloco de instruções a serem executadas quando o bloqueio é adquirido.

  • End SyncLock
    Finaliza um bloco SyncLock.

Comentários

The SyncLock demonstrativo garante que vários threads não executar o bloco de instruções ao mesmo time. SyncLock impede que cada thread Inserir bloco de até que nenhum Outros segmento está executando.

O uso mais comum de SyncLock é para proteger dados de serem atualizados por mais de um segmento simultaneamente.Se as instruções que manipulam os dados devem ir para a conclusão sem interrupção, coloque-as dentro de um bloco SyncLock.

Um bloco de declaração protegido por um bloqueio exclusivo às vezes é chamado de seção crítica.

Regras

  • Ramificação.Você não pode ramificar em um bloco SyncLock de fora do bloco.

  • Bloquear Valor do Objeto.O valor de lockobject não pode ser Nothing.Você deve criar o objeto de bloqueio antes de usá-lo em uma instrução SyncLock.

    Não é possível alterar o valor de lockobject durante a execução de um bloco SyncLock.O mecanismo requer que o objeto de bloqueio permaneça inalterado.

Comportamento

  • Mecanismo.Quando um segmento atinge a instrução SyncLock, ele avalia a expressão lockobject e suspende a execução até que ele obtenha um bloqueio exclusivo no objeto retornado pela expressão.Quando outro segmento alcança a instrução SyncLock, ele não consegue um bloqueio até que o primeiro segmento execute a instrução End SyncLock.

  • Dados protegidos.Se lockobject for uma variável Shared, o bloqueio exclusivo impede um segmento em qualquer instância da classe de executar o bloco SyncLock enquanto qualquer outro segmento o estiver executando.Isso protege os dados que são compartilhados entre todas as instâncias.

    Se lockobject é uma instância de variável (não Shared), o bloqueio impede que um segmento em execução na instância atual execute o bloco SyncLock ao mesmo tempo que outro segmento na mesma instância.Isso protege os dados mantidos pela instância individual.

  • Obtenção e liberação.Um bloco SyncLock se comporta como uma construção Try...Finally na qual o bloco Try obtém um bloqueio exclusivo no lockobject e o bloco Finally o libera.Devido a isso, o bloco SyncLock garante a liberação do bloqueio, não importando como você sai do bloco.Isto é verdadeiro mesmo no caso de uma exceção não manipulada.

  • Chamadas de Estrutura.O bloco SyncLock obtém e libera o bloqueio exclusivo chamando os métodos Enter e Exit da classe Monitor no namespace System.Threading.

Práticas de programação

A expressão lockobject sempre deve avaliar a um objeto que pertence à sua classe exclusivamente.Você deve declarar uma variável de objeto Private para proteger dados pertencentes à instância atual, ou uma variável de objeto Private Shared para proteger dados comuns a todas as instâncias.

Você não deve usar a palavra-chave Me para fornecer um objeto de bloqueio para dados da instância.Se códigos externos a sua classe têm uma referência a uma instância de sua classe, eles podem usar essa referência como um objeto de bloqueio para um bloco SyncLock bloco completamente diferente do seu, protegendo dados diferentes.Dessa maneira, sua classe e a outra classe podem impedir ma a outra de executar seus blocos SyncLock não relacionados.Da mesma forma, o bloqueio em uma sequência de caracteres pode ser problemático porque qualquer outro código no processo usando a mesma sequência de caracteres irá compartilhar o mesmo bloqueio.

Você também não deve usar o método Me.GetType para fornecer um objeto de bloqueio para dados compartilhados.Isso ocorre porque GetType sempre retorna o mesmo objeto Type para um determinado nome de classe.O código externo pode chamar GetType em sua classe e obter o mesmo objeto de bloqueio que você está usando.Isso resultaria nas duas classes impedindo uma a outra de acessar seus blocos SyncLock.

Exemplo

O exemplo a seguir mostra uma classe que mantém uma lista simples de mensagens.Ela armazena as mensagens em uma matriz e o último elemento usado da matriz em uma variável.O procedimento addAnotherMessage incrementa o último elemento e armazena a nova mensagem.Essas duas operações são protegidas pelas instruções SyncLock e End SyncLock, porque depois que o último elemento foi incrementado, a nova mensagem deve ser armazenada antes que qualquer outro segmento possa incrementar o último elemento novamente.

Class simpleMessageList
    Public messagesList() As String = New String(50) {}
    Public messagesLast As Integer = -1
    Private messagesLock As New Object
    Public Sub addAnotherMessage(ByVal newMessage As String)
        SyncLock messagesLock
            messagesLast += 1
            messagesList(messagesLast) = newMessage
        End SyncLock
    End Sub
End Class

Se a classe simpleMessageList compartilhasse uma lista de mensagens entre todas as suas instâncias, então as variáveis messagesList e messagesLast seriam declaradas como Shared.Nesse caso, a variável messagesLock também deve ser Shared, para que haja um único objeto de bloqueio usado por cada instância.

Consulte também

Conceitos

Sincronização de Segmento

Referência

System.Threading

Monitor

Outros recursos

Multithreading no Visual Basic