web-dev-qa-db-de.com

Ich bin verwirrt über die Verwendung der statischen Methode in Multithreading Java.

etwas über statisch:

  • instanzen der statischen Methode der Klassenfreigabe

die ähnlichen fragen:

Ich bin verwirrend über:

  • statische Methode nur einen Speicherblock haben?
  • wenn ich statische Methode im Multithreading verwende, wird es blockiert?
8
freeeze king

Ich bin verwirrend über:

statische Methode nur einen Speicherblock haben? wenn ich statische Methode benutze im Multithreading blockiert es?

Das Schlüsselwort static in Java bedeutet einfach "ohne Berücksichtigung oder Kenntnis einer bestimmten Instanz eines Objekts".

Eine Instanzmethode kann this verwenden, um auf die Felder der zugehörigen Instanz zuzugreifen. Eine statische Methode verfügt jedoch über keine zugeordnete Instanz. Daher macht this keinen Sinn.

Beim Multithreading umfasst Thread-Sicherheit den Schutz der Konsistenz und Integrität von veränderbaren Daten. Da Objekte den Status ihrer Instanzfelder einkapseln, müssen sich Instanzmethoden nur unter solchen Umständen um die Thread-Sicherheit kümmern, unter denen mehrere Threads auf dasselbe Objekt zugreifen.

Obwohl die Thread-Beschränkung eines Objekts eine gültige Thread-Sicherheitsrichtlinie für Instanzen einer Klasse ist, ist dieselbe Argumentation für statische Methoden ungültig, da sie keine Instanz haben. 

Das hat überhaupt nichts mit Speicherblöcken zu tun. Es hat nur mit dem Zugang zu tun. Auf eine Objektinstanz wird über eine Referenz zugegriffen. Wenn die Referenz auf einen Thread beschränkt ist, ist das Objekt, auf das sich diese Referenzpunkte beziehen, immer Thread-sicher. Jeder Thread, der überall auf Ihre Klasse zugreifen kann, kann jedoch potenziell auf seine statischen Member zugreifen, da für deren Verwendung kein Verweis auf eine Instanz erforderlich ist.

Statische Methoden sind standardmäßig nicht blockierend. Sie können Ihre eigene Synchronisations-/Thread-Sicherheitsrichtlinie implementieren und Ihren statischen Methodenblock auf Wunsch blockieren lassen.

9
scottb

statische Methode nur einen Speicherblock haben?

Nein, Methoden haben keine Speicherblöcke. Threads, die diese Methoden ausführen, tun dies. Jeder Thread hat seinen eigenen Speicher auf dem Stack, in dem alle Methodenargumente und Variablen gespeichert werden. 

wenn ich im Multithreading statische Methoden verwende, wird es blockiert

Ein Thread kann nicht auf den Speicher eines anderen Threads zugreifen. Wenn jedoch eine Ressource vorhanden ist, die zu allen Instanzen gehört und auf die sequenziell zugegriffen werden soll, können Sie die statische Methode synchronize oder lock sperren, wodurch sie eine blockierende wird. Ansonsten nein.

6
YoungSpice

Jeder Thread hat seinen eigenen Stack-Speicherplatz. Jedes Mal, wenn ein Thread eine Methode (statisch oder virtuell) aufruft, ordnet der Aufruf einen Stack-Frame zu, der lokale Variablen enthält. Nichts davon ist spezifisch für statische Methoden.

Statische Methoden können gleichzeitig von mehreren Threads aufgerufen werden, es sei denn, Sie tun dies ausdrücklich, indem Sie zum Beispiel verlangen, dass der Aufrufer eine Sperre erhält (z. B. die Verwendung des synchronisierten Schlüsselworts).

Schauen Sie sich Beispiele für Klassen mit statischen Methoden an, beispielsweise Java.lang.Math. Seine Methoden sind zustandslos, so dass keine Sperrung erforderlich ist. Statische Methoden eignen sich für Fälle, in denen kein gemeinsam genutzter Zustand vorliegt. Sie können in den Fällen, in denen auf den gemeinsamen Status "threadsafe" zugegriffen wird oder dieser geändert wird, in Ordnung sein, abhängig davon, welche Ebene der gleichzeitigen Verwendung erforderlich ist und wie effizient die threadsicheren Dinge sind, auf die zugegriffen wird. (Achten Sie auf Engpässe.)

Das Setzen des synchronisierten Schlüsselworts in eine statische Methode kann ein Problem sein, da Ihre Anwendung darauf beschränkt ist, es mit jeweils nur einem Thread aufzurufen. Alternative Strategien, einschließlich der Verwendung atomarer Objekte, der Verwendung von Thread-sicheren Datenstrukturen, die auf hohe Parallelität ausgelegt sind, oder der Verwendung von Thread-Beschränkung sind möglicherweise dem Sperren vorzuziehen.