2010-12-09 9 views
4

Mein Zweifel ist, müssen wir statische Methoden als synchronisiert machen, wenn es innerhalb synchronisierten nicht statischen Methode aufgerufen wird?Müssen statische Methoden synchronisiert werden, wenn sie innerhalb der synchronisierten nicht statischen Methode aufgerufen werden?

für z.B.

class Test 
{ 

     public static void m2() 
     { 


     } 

     public synchronized void m1() 
     { 

      Test.m2(); 
      ---- 
      ---- 
     } 

In obigem Fall muss ich m2 als synchronisiert machen, um Race Condition zu vermeiden, oder sollte ich es behalten wie es ist.

}

Antwort

7

Es hängt davon ab, was Ihre statische Methode macht. Brauchen Sie wirklich, dass es überhaupt synchronisiert wird? Wird auf den freigegebenen veränderbaren Status zugegriffen?

Wenn ja, werden Sie wahrscheinlich Notwendigkeit tun zu synchronisieren (obwohl ich nicht so einfach mit dem synchronized Modifikator tun würde - ich eine private static final Variable mit einem Objekt erstellen würde zu erfassen.)

Die Tatsache, dass Ihre Instanzmethode synchronisiert wird, bedeutet, dass keine zwei Threads es mit dem gleichen Zielobjekt ausführen - aber zwei Threads könnten beide m1 mit verschiedenen Zielobjekte ausführen, so m2 könnte zweimal gleichzeitig aufgerufen werden . Ob das ein Problem ist oder nicht, hängt davon ab, was es tut. Wenn kein gemeinsamer Status verwendet wird (z. B. wird nur etwas basierend auf seinen Parametern berechnet), muss es überhaupt nicht synchronisiert werden. Im Allgemeinen ist es für statische Methoden wichtiger, threadsicherer zu sein als Instanzmethoden: I normalerweise nicht machen Sie Typen selbst Thread-sicher, aber stattdessen versuchen, ein paar Klassen verwenden, um Nebenläufigkeit zu verwalten thread mit einem eigenen Satz von separaten Objekten so weit wie möglich.

+1

Ich habe ein bisschen ein Problem mit Ihrem letzten Absatz. Code-Mutationsobjekte, die aus der Statik referenzierbar sind, müssen Thread-sicher sein, obwohl dies normalerweise nicht gemacht werden sollte. Fast alle statischen Methoden sollten die Statik nicht mutieren und müssen daher nicht threadsicher sein. Sie würden beispielsweise 'Collections.sort' nicht threadsicher machen. –

+0

@Tom: Ich würde sagen, dass Collections.sort * automatisch threadsicher ist, vorausgesetzt, Sie übergeben keine Sammlung, die in anderen Threads beobachtet wird. Wenn die statische Methode nicht den globalen Status ändert, ist sie genauso threadsicher wie alles, was in den Status übergeben wurde (falls überhaupt). Wenn es den globalen Status * ändert (oder möglicherweise nur beobachtet), sollten Sie alle erforderlichen Sperren anwenden, um es threadsicher zu machen. –

+1

+1 für die Erwähnung der "statischen" Methode sind anfälliger. – fastcodejava

0

Allgemeinen könnte es nützlich sein, ein Verfahren static zu synchronisieren. Zum Beispiel in diesem Fall:

private static final List<Object> GLOBAL_STATE = new ArrayList<Object>(); 

public static synchronized void add(Object foo) { 
    GLOBAL_STATE.add(foo); 
} 

Aber in Ihrem Fall rufen Sie die Methode von einer anderen bereits synchronisierten Methode. Sie müssen es also nicht synchronisieren. Aber in Ihrem Beispiel machen Sie Ihre static Methode public. Wenn dies beabsichtigt war, machen Sie es auch synchronized.

2

Sie müssen m2 synchronisiert werden. Andernfalls kann jemand diese Methode gleichzeitig aufrufen. Ich gehe davon aus, m2 würde für die Synchronisierung in Betracht gezogen werden, sonst ist es ein strittiger Punkt.

Verwandte Themen