2010-12-11 17 views
2

Ich habe zwei Threads erstellt und eine einzelne Instanz der Klasse namens statische und nicht statische Methoden dieses Objekts verwendet. Idealerweise müssen statische Methoden mit dem Klassennamen aufgerufen werden, und das habe ich auch getan.Synchronisierte Blöcke für statische und nicht statische Methoden

Ich synchronisierte die statischen und nicht statischen Methoden auf einem privaten statischen Member der Klasse, deren Methoden die Threads aufrufen. Ich habe festgestellt, dass die Ausgabe synchronisiert wurde!

Meine Fragen sind:

  1. Statische Methoden synchronisiert, wenn eine synchronisierte Block unter Verwendung es in der Regel die Klasseninstanz erfordert, dann, wie es ein statisches Objekt angenommen haben!

  2. Wie wurde die Ausgabe synchronisiert, während Threads, die statische Methoden aufrufen, die Sperre auf Klassenebene erhalten und Threads, die nicht-statische Methoden aufrufen, eine Sperre auf Objektebene erhalten!
    Obwohl ich synchronisierten Block sowohl in der statischen als auch in der nicht-statischen Methode basierend auf einem Objekt verwendet habe, sollte es wirklich nicht synchronisieren; oder ist es ein Sonderfall mit synchronisierten Blöcken auf statischen Objekten?

Bitte lassen Sie mich wissen.

Es folgt der Code, den ich geschrieben habe:

public class StaticNonStaticSynch 
{ 
public static void main(String[] args) 
{ 
    final StaticNonStaticTest staticNonStaticTest = new StaticNonStaticTest(); 

    Runnable runnable1 = new Runnable() 
    { 
    @Override 
    public void run() 
    { 
    staticNonStaticTest.nonStaticMethod(); 
    } 
    }; 

    Runnable runnable2 = new Runnable() 
    { 
    @Override 
    public void run() 
    { 
    staticNonStaticTest.staticMethod(); 
    } 
    }; 

    Thread thread1 = new Thread(runnable1, "First Thread"); 
    Thread thread2 = new Thread(runnable2, "Second Thread"); 

    thread1.start(); 
    thread2.start(); 
} 
} 

class StaticNonStaticTest 
{ 
private static Object object = new Object(); 

void nonStaticMethod() 
{ 
    synchronized (object) 
    { 
    for(int i=0;i<500;i++) 
    { 
    System.out.println("Non - Static method called by " + Thread.currentThread().getName() +" : = "+i); 
    } 
    } 
} 

static void staticMethod() 
{ 
    synchronized (object) 
    { 
    for(int i=0;i<500;i++) 
    { 
    System.out.println("Static method called by " + Thread.currentThread().getName() +" : = "+i); 
    } 
    } 
} 
} 
+0

Bitte bearbeiten Sie den Text richtig. Verwenden Sie das 101010-Symbol für das Code-Snippet. –

+0

_ "Threads, die nicht statische Methoden aufrufen, erfassen die Sperre auf Objektebene" _ sie erhalten keine Sperre auf Objektebene. Die Instanzmethode erwirbt eine Sperre auf Klassenebene. – khachik

Antwort

4

Weltweit gibt es eine Instanz der Sache StaticNonStaticTest.object genannt. Immer wenn Sie das Ding synchronisieren (egal wo von), synchronisieren Sie auf dem gleichen Schloss.

-1

Sie synchronisieren auf der Basis eines statischen Objekts, das ist der Grund, warum die Sperre auf Klassenebene erreicht wird und sowohl die statische als auch die nicht statische Methode synchronisiert werden. Wenn Sie die Zeile "synchronized (object)" in der statischen und nicht statischen Methode auskommentieren, können Sie sehen, dass die Aufrufe nicht mehr synchronisiert sind.