2014-01-28 16 views
5

dieser Code AngenommenErweiterte Klassen synchronisierte Methoden Verriegelung

class A 
{ 
    public synchronized void methodA() 
    { 
     // ... 
    } 
} 

class B extends A 
{ 
    @Override 
    public synchronized void methodA() 
    { 
     // ... 
     super.methodA(); 
    } 
} 

Welche Sperre sollte von jedem Thread erworben werden, wenn es methodA Funktion der Klasse B und methodA der Superklasse A von super.methodA() zugreifen möchte?

Antwort

2

Eine synchronized Methode entspricht einer Methode mit ihrem Körper in einem synchronized(this) Block gewickelt. Somit folgt aus:

public synchronized void methodA() 
{ 
    // ... 
} 

ist die gleiche wie:

public void methodA() 
{ 
    synchronized(this) { 
     // ... 
    } 
} 

Jetzt können Sie leicht erkennen, dass beide methodA Implementierungen sperren auf das gleiche Objekt, nämlich das this Objekt. Das heißt, wenn ein Thread in einer synchronized Methode der Superklasse ist, verhindert es auch, dass andere Threads keine synchronized Methode der Unterklasse eingeben (und umgekehrt).

Seit synchronized Sperren sind Re-Entrant, erfolgreich eingeben B.methodA bedeutet, dass Sie auch sofort super.methodA eingeben können (wie Sie bereits die Sperre haben).

3

Wenn Sie B b = new B(); b.methodA(); anrufen, wird der aktuelle Thread die Sperre b annehmen, B.methodA eingeben und A.methodA anrufen. Beide Methoden teilen sich das gleiche Objekt, und bei der Eingabe von A.methodA wird der Thread einfach wieder in die gleiche Sperre eintreten, die er bereits besitzt.

Verwandte Themen