Synchronisation in Java?
-
11-09-2019 - |
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();
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 .