Wenn eine Methode nur auf lokale Variablen zugreift, ist sie threadsicher. Ist es das?
Absolut nicht. Sie können ein Programm mit nur einer lokalen Variablen schreiben, auf die von einem einzelnen Thread aus zugegriffen wird, der jedoch nicht threadsicher ist:
https://stackoverflow.com/a/8883117/88656
Gilt das auch für statische Methoden?
Absolut nicht.
Eine Antwort von @Cybis lautete: "Lokale Variablen können nicht von Threads gemeinsam genutzt werden, da jeder Thread seinen eigenen Stapel erhält."
Absolut nicht. Das Unterscheidungsmerkmal einer lokalen Variablen besteht darin, dass sie nur innerhalb des lokalen Bereichs sichtbar ist und nicht im temporären Pool zugeordnet ist . Es ist völlig legal und möglich, von zwei verschiedenen Threads auf dieselbe lokale Variable zuzugreifen. Sie können dazu anonyme Methoden, Lambdas, Iteratorblöcke oder asynchrone Methoden verwenden.
Gilt das auch für statische Methoden?
Absolut nicht.
Wenn einer Methode ein Referenzobjekt übergeben wird, bricht dies die Thread-Sicherheit?
Vielleicht.
Ich habe einige Nachforschungen angestellt, und es gibt eine Menge über bestimmte Fälle, aber ich hatte gehofft, mit nur wenigen Regeln Richtlinien definieren zu können, die befolgt werden müssen, um sicherzustellen, dass eine Methode threadsicher ist.
Sie müssen lernen, mit Enttäuschung zu leben. Dies ist ein sehr schwieriges Thema.
Meine letzte Frage lautet also: "Gibt es eine kurze Liste von Regeln, die eine thread-sichere Methode definieren?
Nee. Wie Sie in meinem Beispiel zuvor gesehen haben, kann eine leere Methode nicht threadsicher sein . Sie können auch fragen, ob es eine kurze Liste von Regeln gibt, die sicherstellen, dass eine Methode korrekt ist . Nein, da ist kein. Die Gewindesicherheit ist nichts anderes als eine äußerst komplizierte Art der Korrektheit.
Darüber hinaus weist die Tatsache, dass Sie die Frage stellen, auf Ihr grundlegendes Missverständnis hinsichtlich der Thread-Sicherheit hin. Die Thread-Sicherheit ist eine globale und keine lokale Eigenschaft eines Programms. Der Grund, warum es so schwierig ist, das Richtige zu finden, liegt darin, dass Sie das Threading-Verhalten des gesamten Programms vollständig kennen müssen, um seine Sicherheit zu gewährleisten.
Schauen Sie sich noch einmal mein Beispiel an: Jede Methode ist trivial . Es ist die Art und Weise, wie die Methoden auf einer "globalen" Ebene miteinander interagieren, die das Programm zum Stillstand bringt. Sie können nicht jede Methode betrachten und als "sicher" abhaken und dann erwarten, dass das gesamte Programm sicher ist, genauso wenig wie Sie daraus schließen können, dass Ihr Haus auch aus 100% nicht hohlen Ziegeln besteht nicht hohl. Die Hohlheit eines Hauses ist ein globales Eigentum des Ganzen, kein Aggregat der Eigenschaften seiner Teile.