Si une méthode accède uniquement aux variables locales, elle est thread-safe. Est-ce que c'est ça?
Absolument pas. Vous pouvez écrire un programme avec une seule variable locale accessible à partir d'un seul thread qui n'est cependant pas threadsafe:
https://stackoverflow.com/a/8883117/88656
Cela s'applique-t-il également aux méthodes statiques?
Absolument pas.
Une réponse, fournie par @Cybis, était: "Les variables locales ne peuvent pas être partagées entre les threads car chaque thread obtient sa propre pile."
Absolument pas. La caractéristique distinctive d'une variable locale est qu'elle n'est visible que depuis l'étendue locale , et non qu'elle est allouée sur le pool temporaire . Il est parfaitement légal et possible d'accéder à la même variable locale à partir de deux threads différents. Vous pouvez le faire en utilisant des méthodes anonymes, des lambdas, des blocs d'itérateur ou des méthodes asynchrones.
Est-ce également le cas des méthodes statiques?
Absolument pas.
Si une méthode reçoit un objet de référence, cela brise-t-il la sécurité des threads?
Peut être.
J'ai fait quelques recherches, et il y a beaucoup de choses sur certains cas, mais j'espérais être en mesure de définir, en utilisant seulement quelques règles, des directives à suivre pour m'assurer qu'une méthode est thread-safe.
Vous allez devoir apprendre à vivre avec la déception. C'est un sujet très difficile.
Donc, je suppose que ma question ultime est: "Y a-t-il une courte liste de règles qui définissent une méthode thread-safe?
Nan. Comme vous l'avez vu dans mon exemple plus tôt, une méthode vide peut être non thread-safe . Vous pourriez aussi bien demander "existe-t-il une courte liste de règles garantissant qu'une méthode est correcte ". Non, il n'y en a pas. La sécurité des fils n'est rien de plus qu'un type d'exactitude extrêmement compliqué.
De plus, le fait que vous posiez la question indique votre malentendu fondamental sur la sécurité des fils. La sécurité des threads est une propriété globale et non locale d'un programme. La raison pour laquelle il est si difficile de bien faire est que vous devez avoir une connaissance complète du comportement de threading de l'ensemble du programme afin d'assurer sa sécurité.
Encore une fois, regardez mon exemple: chaque méthode est triviale . C'est la façon dont les méthodes interagissent les unes avec les autres à un niveau «global» qui rend le programme dans l'impasse. Vous ne pouvez pas regarder toutes les méthodes et les cocher comme "sûres" et vous attendre à ce que tout le programme soit sûr, pas plus que vous ne pouvez en conclure que parce que votre maison est faite de briques à 100% non creuses, la maison est également non creux. Le creux d'une maison est une propriété globale de l'ensemble, pas un agrégat des propriétés de ses parties.