2010-12-14 4 views
5

In welchen Situationen müssen Sie sich Gedanken darüber machen, ob eine statische Methode Thread-sicher ist?Wann müssen Sie sich um die Fadensicherheit sorgen?

Zum Beispiel, wenn ich statische Dienstprogrammfunktion habe, die keine statischen Variablen auf Klassenebene berührt, ist diese Methode bereits threadsicher? Wenn ich eine statische Methode habe, die statische Klassenvariablen berührt, ist diese Methode möglicherweise nicht threadsicher?

Vielen Dank im Voraus.

Antwort

6

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.

+0

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. –

3

Sie müssen sich um die Thread-Sicherheit kümmern, wenn mehrere Threads auf dieselben Ressourcen zugreifen.

Ihre statische Methode ist möglicherweise unsicher, wenn sie die gleichen Ressourcen wie andere Threads - direkt oder indirekt - verwendet, auch wenn diese Ressourcen keine statischen Klassenvariablen sind.

+1

Und es gibt andere Möglichkeiten als statische Felder für zwei Threads Daten gemeinsam zu nutzen. Betrachten Sie die Methode static void MyClass.copy (to, from). –

2

Es ist Thread-sicher, wenn nicht auf änderbare Ressourcen wie Klassenvariablen zugegriffen wird. Sie müssen jedoch sicherstellen, dass Ihre Methode keine anderen Methoden aufruft, die auf änderbare Ressourcen zugreifen.

+0

Es kann jedoch auch Thread-sicher sein, wenn auf änderbare Ressourcen zugegriffen wird, wenn der Zugriff synchronisiert ist. –

0

Gewindesicherheit wird ein Problem, wenn es mindestens einen einzigen Zugangspunkt gibt, auf den mehrere Threads zugreifen können.

Wenn auf einen Codeabschnitt von mehreren Threads zugegriffen wird und andere Methode/Klasse/etc. Aufgerufen wird, wird der gesamte Codebaum anfällig.

Von "Java Concurrency in der Praxis": Der erste Schritt beim Organisieren eines Programms um Aufgabenausführung herum ist das Identifizieren von sinnvollen Aufgabengrenzen. Idealerweise sind Aufgaben unabhängige Aktivitäten: Arbeiten, die nicht sind, hängen vom Zustand, Ergebnis oder den Nebenwirkungen anderer Aufgaben ab. Unabhängigkeit erleichtert Parallelität, da unabhängige Aufgaben parallel ausgeführt werden können, wenn adäquate Verarbeitungsressourcen vorhanden sind.

Wenn Sie beispielsweise ein isoliertes Servlet schreiben, das garantiert von einem einzigen Thread ausgeführt wird, müssen Sie sich keine Sorgen machen. Wenn Sie jedoch ein statisches Dienstprogramm schreiben, das von verschiedenen Servlets verwendet wird, muss es für den Multi-Thread-Zugriff erstellt werden.

2

Sie müssen sich um die Threadsicherheit kümmern, wenn mehrere Threads auf dieselben Ressourcen zugreifen und diese Ressourcen nicht unveränderbar sind.

2

Wenn Sie eine Methode, die auf jeden Zustand schreibt, die über mehrere Threads gemeinsam genutzt werden (zB statische Variablen oder alle Objekte, die mehr Threads verwenden), dann muss das Verfahren über Thread-Sicherheit sorgen, und so Führen Sie alle Methoden aus, die diesen gemeinsamen Status lesen.

5

Wenn Sie nur statische Stapelvariablen in der statischen Methode verwenden, gibt es keinen Grund zur Sorge. java.lang.Math.min (int, int) ist ein gutes Beispiel für eine solche Methode. Aber wenn Sie statische Variablen oder statische Objekte berühren (auch nicht unveränderbar), müssen Sie die Synchronisation verwenden.

+0

Meinen Sie "keinen Grund zur Sorge" in Ihrer ersten sentance ...? –

+0

Danke Tony. Das war ein Tippfehler. –

Verwandte Themen