Métodos estáticos não são thread-safe.

A regra é simples e única: Métodos estáticos serão thread-safe, isto é, poderão ser chamados de duas ou mais threads ao mesmo tempo sem interferência no funcionamento esperado, se e somente se eles não acessarem nenhum dado que também possa ser acessado por outra thread.

No entanto a explicação acima deixa a seguinte dúvida: Quais são os dados que podem ser acessados pelas outras threads?

A resposta é a seguinte: Quando uma thread chama um método estático, ela copia o código desse método estático para a sua pilha privada de execução, isto é, ela tira uma cópia do método e executa essa cópia. Portanto, qualquer variável que seja declarada dentro desse método não será alterada por outra thread que possa estar executando o mesmo código no mesmo momento. No entanto, se este método fizer referência a uma variável ByRef, isto é, a uma instância de objeto que não tenha sido declarada dentro dele, ou a uma variável estática compartilhada entre threads, este método corre sérios riscos de entrar em condição de disputa e produzir resultados desastrosos.

Sendo assim, o seguinte método estático é thread-safe:

public static void Insert(String name, String scriptText) {
 String query = String.Format(
  @”INSERT INTO Script (Name, ScriptText) VALUES (‘{0}’, ‘{1}’)”,
  name,
  scriptText
 );
 ExecuteNonQuery(query);
}

Mas o seguinte método estático não é thread-safe:

public static void Insert(Script script) {
 String query = String.Format(
  @”INSERT INTO Script (Name, ScriptText) VALUES (‘{0}’, ‘{1}’)”,
  script.Name,
  script.ScriptText
 );
 ExecuteNonQuery(query);
}

Por quê? Porque a variável passada como parâmetro Script é ByRef (reference type) e foi criada fora do contexto do método. Mas isso só vai dar problema se outra thread estiver alterando o valor do mesmo objeto Script durante a execução desta thread. Se o mesmo método for chamado passando-se outro objeto Script, nada de anormal vai acontecer.

Mais detalhes sobre esse assunto, com vários exemplos e outras soluções, podem ser encontrados aqui:

http://stackoverflow.com/questions/420895/how-do-i-know-if-a-c-method-is-thread-safe

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s