Se um método acessa apenas variáveis locais, é seguro para threads. É isso?
Absolutamente não. Você pode escrever um programa com apenas uma única variável local acessada a partir de um único thread que, no entanto, não é seguro:
https://stackoverflow.com/a/8883117/88656
Isso também se aplica a métodos estáticos?
Absolutamente não.
Uma resposta, fornecida pelo @Cybis, foi: "Variáveis locais não podem ser compartilhadas entre os segmentos, porque cada segmento recebe sua própria pilha".
Absolutamente não. A característica distintiva de uma variável local é que ela só é visível no escopo local , e não que seja alocada no pool temporário . É perfeitamente legal e possível acessar a mesma variável local a partir de dois threads diferentes. Você pode fazer isso usando métodos anônimos, lambdas, blocos de iteradores ou métodos assíncronos.
Esse também é o caso dos métodos estáticos?
Absolutamente não.
Se um método é passado para um objeto de referência, isso quebra a segurança do encadeamento?
Talvez.
Eu fiz algumas pesquisas e existem muitos casos sobre certos casos, mas eu esperava poder definir, usando apenas algumas regras, diretrizes a seguir para garantir que um método seja seguro para threads.
Você terá que aprender a viver com decepção. Este é um assunto muito difícil.
Então, acho que minha pergunta final é: "Existe uma pequena lista de regras que definem um método seguro para threads?
Não. Como você viu no meu exemplo anterior, um método vazio pode não ser seguro para threads . Você também pode perguntar "existe uma pequena lista de regras que garantem que um método esteja correto ". Não, não há. A segurança da linha nada mais é do que um tipo de correção extremamente complicado.
Além disso, o fato de você estar fazendo a pergunta indica seu mal-entendido fundamental sobre segurança de threads. A segurança do thread é uma propriedade global e não local de um programa. A razão pela qual é tão difícil acertar é porque você deve ter um conhecimento completo do comportamento de segmentação de todo o programa para garantir sua segurança.
Novamente, veja o meu exemplo: todo método é trivial . É a maneira como os métodos interagem entre si em um nível "global" que torna o programa em conflito. Você não pode olhar para todos os métodos e selecioná-lo como "seguro" e esperar que todo o programa seja seguro, assim como não é possível concluir que, porque sua casa é feita de tijolos 100% não vazados, a casa também é não oco. O vazio de uma casa é uma propriedade global de toda a coisa, não um agregado das propriedades de suas partes.