Frage

Ich bin ziemlich neu Programmierung thread-sicher, und mich gefragt, ob ich wie unten etwas haben, wäre dies von Deadlock sicher einmal kompiliert und ausgeführt?

public class Foo  
{  
    protected CustomClass[] _mySynchedData = new CustomClass[10];

    public void processData()
    {
        synchronized(_mySynchedData) {
            // ...do stuff with synched variable here
        }
    }
}


public class Bar extends Foo
{

    @Override
    public void processData()
    {
        synchronized(_mySynchedData) {
            // perform extended functionality on synched variable here

            // ...then continue onto parent functionality while keeping synched
            super.processData();
        }
    }
}


Bar testObj = new Bar();

// Deadlock?
testObj.processData();
War es hilfreich?

Lösung

Ihr Code nur einen einzigen Thread angezeigt werden soll.

Mit nur einem Thread, gibt es keine Möglichkeit, jede Blockade bekommen.

Hinzugefügt:
Java-Sprache unterstützt, was sie offiziell Reentry-Synchronisation nennen. Im Grunde bedeutet es, dass ein einzelner Thread eine Sperre reacquire kann es bereits besitzt.

Andere Tipps

Ihre Frage ist, was passiert, wenn Sie zweimal auf das gleiche Objekt zu synchronisieren.

Die Antwort lautet: Java zunächst prüfen wird, welcher Thread besitzt den Monitor (das ist die interne Datenstruktur, auf der synchronized arbeitet). Da der Besitzer Faden das gleiche wie der aktuelle Thread ist, wird Java weiter.

Deadlocks kann nur passieren, wenn Sie zwei Monitore haben und Sie versuchen, sie in unterschiedlicher Reihenfolge in verschiedenen Threads zu sperren.

Die Sperre durch die Java synchronisiert Schlüsselwort genommen unterstützt nisten, so dass Sie durch die Synchronisation auf das gleiche Objekt mehrmals im selben Thread keinen Deadlock riskieren.

RichN ist richtig, dass Ihr Code enthält nur einen einzigen Thread und damit Deadlock ist unmöglich. Beachten Sie auch, dass für ein Deadlock Sie mehrere Threads müssen auftreten haben, den Erwerb mehr Schlösser (wenn auch in einer anderen Reihenfolge ) für ein Deadlock auftreten.

Ihr Code zur Zeit verweist nur eine Sperre: Die mit _mySynchedData verbunden. Die Tatsache, dass Sie versuchen, es zu sperren zweimal spielt keine Rolle, wie Schlösser in Java sind einspringenden .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top