Wenn ich statische Dienstprogrammfunktion habe, die keine statischen Variablen auf Klassenebene berührt, ist diese Methode bereits Thread-sicher?
Die meiste Zeit - was zählt, ist, wenn Ihre Methode reentrant ist. So etwas ist einspringenden weil alles lokale Variablen ist und jeder Thread erhält seine eigene Kopie:
static int add(int a, int b)
{
return a + b;
}
Es gibt noch einige Dinge, vorsichtig zu sein. Wenn Sie ein Objekt an die Methode übergeben und die Methode das Objekt mutiert und bevor die Methode abgeschlossen ist, rufen Sie die gleiche Methode erneut für einen anderen Thread als mit dem gleichen Objekt auf, dann haben Sie ein Problem.
Wenn ich eine statische Methode habe, die statische Klassenvariablen berührt, ist diese Methode möglicherweise nicht threadsicher?
Das Hauptproblem ist wieder, wenn die Variablen veränderbar sind. Wenn Sie nur von unveränderlichen Objekten lesen, gibt es möglicherweise kein Problem.
Wenn Sie eine Methode aufrufen und Sie nicht sicher sind, ob es reentrant ist und die Dokumentation nicht sagt, ist es am besten anzunehmen, dass dies nicht der Fall ist.
Die Berücksichtigung * simultaner * Lese-/Schreibvorgänge ist nicht genug; Wenn Speicher nicht um eine Barriere herum synchronisiert ist (wie durch das JMM dokumentiert), kann der eine oder der andere Thread veraltete Werte beobachten, und geschriebene Werte können verloren gehen, selbst wenn sie nicht tatsächlich zeitlich widersprüchlich sind. Aus dem gleichen Grund ist auch nur ein einziges Drehbuchszenarios gebrochen, wenn keine Speicherbarriere vorhanden ist. –