Será que o bloqueio (objlocker) fazer esse aplicativo segmento seguro objeto de largura? E são membros estáticos fio automaticamente seguro?

StackOverflow https://stackoverflow.com/questions/274344

Pergunta

Quando você bloquear um objeto é que objeto bloqueado durante todo o aplicativo?

Por exemplo, este trecho do C # 3.0 in a Nutshell Seção 19.6.1 "tipo thread de segurança e do .NET Framework":

static void AddItems(  )
  {
    for (int i = 0; i < 100; i++)
      lock (list)
        list.Add ("Item " + list.Count);

    string[] items;
    lock (list) items = list.ToArray(  );
    foreach (string s in items) Console.WriteLine (s);
  }

Será que o primeiro bloqueio:

lock (list)
        list.Add ("Item " + list.Count);

evitar outro segmento de acessar:

lock (list) items = list.ToArray(  );

ou ambos podem ser executadas ao mesmo tempo?

E se o CLR automaticamente fazer seus métodos estáticos thread-safe? Ou é que até o desenvolvedor?

Obrigado, John

Foi útil?

Solução

class UsefulStuff {
    object _TheLock = new object { };
    public void UsefulThingNumberOne() {
        lock(_TheLock) {
            //CodeBlockA
        }
    }
    public void UsefulThingNumberTwo() {
        lock(_TheLock) {
            //CodeBlockB
        }
    }
}

CodeBlockA e CodeBlockB são impedidos de executar ao mesmo tempo em diferentes linhas, porque eles são ambos bloqueado no mesmo objecto exemplo _TheLock.

Os métodos em _TheLock em si não são afetados.

Outras dicas

Uma outra coisa a notar é que construtores estáticos são executados de uma maneira threadsafe pelo tempo de execução. Se você está criando um singleton e declará-la como:

public class Foo
{
    private static Foo instance = new Foo();

    public static Foo Instance
    {
        get { return instance; }
    }
}

Em seguida, ele será threadsafe. Se, no entanto, você instanciar um novo Foo dentro o getter Instância, então você precisa escrever a sua própria segurança thread (ie. Bloquear um objeto)

O CLR não significa automaticamente que métodos estáticos thread-safe; você deve fazê-lo sozinho.

Bloqueio (lista) usa esse objeto como um bloqueio, por isso, se um segmento diferente atinge outro ponto com bloqueio (lista) (com a mesma 'lista' objeto), o outro thread irá bloquear até que o primeiro segmento libera o bloqueio.

Para ser claro, bloqueio (foo) não "bloquear o objeto foo", mas sim adquire o bloqueio associado ao objeto foo para que a seção crítica (a declaração na construção "de bloqueio (o) stmt") é executado somente quando o segmento atual adquiriu o bloqueio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top