Será que o bloqueio (objlocker) fazer esse aplicativo segmento seguro objeto de largura? E são membros estáticos fio automaticamente seguro?
-
07-07-2019 - |
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
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.