27 Stimmen

Gleichzeitiger Zugriff auf statische Methoden

Ich habe eine statische Methode mit der folgenden Signatur:

public static List processRequest(RequestObject req){
  // process the request object and return the results.
}

Was passiert, wenn mehrere Calls gleichzeitig zu der oben genannten Methode gemacht werden? Werden die Requests gleichzeitig oder nacheinander verarbeitet?

30voto

Andremoniy Punkte 33062

Antworten genau auf deine Frage:

  1. Methode wird gleichzeitig ausgeführt (mehrmals zur gleichen Zeit, wenn du mehrere Threads hast).
  2. Anfragen werden gleichzeitig behandelt.

Du musst den synchronized Modifizierer hinzufügen, wenn du mit Objekten arbeitest, die gleichzeitigen Zugriff erfordern.

21voto

ben75 Punkte 28599

All Ihre Aufrufe der Methode werden gleichzeitig ausgeführt... aber:

Sie können ein Konflikt bei der Nebenläufigkeit (und in einer nicht threadsicheren Situation) haben, sobald der Code Ihrer statischen Methode statische Variablen ändert. In diesem Fall können Sie Ihre Methode als synchronized deklarieren

Wenn Ihre Methode nur lokale Variablen verwendet, haben Sie keine Probleme mit Nebenläufigkeit.

15voto

Ted Hopp Punkte 227177

Wenn Sie gleichzeitige Ausführung vermeiden müssen, müssen Sie explizit synchronisieren. Die Tatsache, dass die Methode statisch ist, spielt dabei keine Rolle. Wenn Sie die Methode selbst als synchronized deklarieren, erfolgt die Synchronisierung am Klassenobjekt. Andernfalls müssen Sie auf ein statisches Objekt synchronisieren (da this für statische Methoden nicht existiert).

8voto

swayamraina Punkte 2624

Ich sehe viele Antworten, aber keine, die wirklich auf den Grund hinweisen.

Das kann so gedacht werden,
Immer wenn ein Thread erstellt wird, wird er mit seinem eigenen Stack erstellt (ich schätze, die Größe des Stacks zum Zeitpunkt der Erstellung beträgt ungefähr 2 MB). Also findet jede Ausführung tatsächlich im Kontext dieses Thread-Stacks statt.
Jede erstellte Variable lebt im Heap, aber ihr Verweis lebt im Stack, mit Ausnahmen von statischen Variablen, die nicht im Thread-Stack leben.

Jeder Funktionsaufruf, den Sie machen, wird tatsächlich auf den Thread-Stack geschoben, sei es statisch oder nicht statisch. Da die komplette Methode auf den Stack geschoben wurde, lebt jede Variableerstellung im Stack (wieder mit Ausnahmen von statischen Variablen) und ist nur für einen Thread zugänglich.

Also sind alle Methoden thread-sicher, bis sie den Zustand einer statischen Variable ändern.

3voto

Raffaele Punkte 20367

Sie können es selbst überprüfen:

public class ConcurrentStatic {

    public static void main(String[] args) {
        for (String name: new String[] {"Foo", "Bar", "Baz"}) {
            new Thread(getRunnable(name)).start();
        }
    }

    public static Runnable getRunnable(final String name) {
        return new Runnable() {
            public void run() {
                longTask(name);
            }
        };
    }

    public static void longTask(String label) {
        System.out.println(label + ": start");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(label + ": end");
    }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X