Jede Frage über "Thread-Sicherheit" muss eine Frage über veränderbar sein, gemeinsame Daten. Sofern Ihre Threads keine änderbaren Daten teilen, gibt es kein Threadsicherheitsproblem.
Ein veränderbares Objekt oder eine Gruppe veränderbarer Objekte in Ihrem Programm ist "Thread safe", wenn es für die Aktion eines einzelnen Threads nicht möglich ist, das Objekt/die Gruppe in einen "schlechten" Zustand zu versetzen andere Themen.
die einfachste, gebräuchlichste Weg, Thread-Sicherheit eines Objekts/Gruppe zu gewährleisten ist mutual exclusion zu verwenden (das heißt, synchronized
Blöcke und/oder Methoden). Wenn jede Methode, die oder READS die Daten ändert, tut dies nur innerhalb von Code-Blöcken, die alle synchronized
auf dem gleichen Objekt sind, und wenn die Mutator-Funktionen immer sicherstellen, dass das Objekt/Gruppe in einem gültigen Zustand ist, bevor synchronized
Block verlassen, dann ist dieses Objekt/diese Gruppe "threadsicher".
Ihre Frage erwähnt keine Daten. Ihre Frage erwähnt nicht, ob es mögliche "ungültige" Zustände gibt, in denen die Daten enthalten sein könnten. Ihre Frage bezieht sich auf eine Methode, aber nicht auf andere Methoden, die auf dieselben Daten zugreifen.
Wenn die fragliche Methode static
und synchronized
ist, dann garantiert das, dass keine zwei Threads jemals die Methode gleichzeitig eingeben können, aber das macht die Daten nicht "threadsicher", wenn es solche gibt alle andere Methoden, die auf dieselben Daten zugreifen oder sie ändern.
Alle Codeblöcke und/oder Methoden, die auf die Daten zugreifen, müssen synchronized
sein, und sie müssen alle auf demselben Sperrobjekt synchronisiert sein.
Eigentlich Synchronisieren jeder Zugriff könnte zu viel des Guten.Aber es gibt keine Möglichkeit, das zu wissen, ohne zu wissen, welche Daten die Threads teilen und was sie mit den Daten machen.
Es geht nur um die Daten.
Ja, es ist sicher, da das Monitorobjekt vom Objekt auf Klassenebene gehalten wird. – 11thdimension
Wenn Ihre statische Methode zustandslos ist, muss sie möglicherweise nicht synchronisiert werden. – Andreas
Warum wird die Methode synchronisiert? Verwendet es einen Zustand auf Klassenebene? –