PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Threadsynchronisation


Senior Sanchez
2007-07-10, 12:17:35
Hi,

Mal ne Frage:

Ich habe n Threads die auf insgesamt m verschiedenen Objekten eine Operation ausführen. Dabei führt jeder Thread eine Operation zwischen zwei Objekten durch.

Die Frage ist jetzt folgende. Wenn ich die Methode "operation", die zwei dieser Objekte als Parameter entgegen nimmt, synchronized deklariere, wird dann beim ausführen die Methode komplett gesperrt oder wird über die Parameter gesperrt? Sprich, können andere Threads derselben Klasse dann operation mit zwei anderen Parametern ausführen?

bneu
2007-07-10, 12:43:27
Meiner Meinung nach müßte die Operation (gibts nur ein Object davon? statisch? ) dann für die Dauer der "Operation" gesperrt sein und andere Aufrufer müssen warten

Monger
2007-07-10, 13:16:04
Wenn du "synchronized" in den Methodenkopf reinschreibst, ist das immer ein "synchronized(this)". Es wird also das gesamte Objekt gesperrt.

Beispiel:

public class TestKlasse{

public synchronized void methodeA(){}

public synchronized void methodeB(){}

}


Wenn jetzt jemand einen Aufruf auf diese Objekt an Methode A und dann einen an Methode B absetzt, wird Methode B erst dann anfangen, wenn A fertig ist. Sowas kann schnell zu Lockdowns führen, deshalb sollte man sehr vorsichtig mit dem synchronized Keyword umgehen. Sicherer ist, wenn man es explizit von Hand macht:


synchronized(mutex){
// ...
}


Oder noch besser natürlich: vorgefertigte synchronisierte Strukturen nehmen.

Senior Sanchez
2007-07-10, 17:17:23
Hmm, ich glaube das kam nicht so recht an, was ich meinte.



public class Threader extends Thread {

private final Object ob1;
private final Object ob2;

public Threader(Object ob1, Object ob2) {
this.ob1 = ob1;
this.ob2 = ob2;
}

public void run() {
while(true) {
operation(ob1, ob2);
}
}

public synchronized void operation(Object ob1, Object ob2) {
//tue was auf ob1 und ob2
}

}


Das das jetzt nicht unbedingt sinnvoll ist, ist mir klar, es geht nur ums Prinzip.
Die Frage ist jetzt, wie da verfahren wird. Wird, wenn sich eine Instanz von Threader in operation befindet die Methode komplett gesperrt sodass auch andere Instanzen von Threader diese nicht aufrufen können? Oder wird über die Parameter gelocked, sodass nur dann andere Threader-Objekte operation aufrufen dürfen, wenn diese keinen der gelockten Parameter verwenden? Oder ist es ganz anders?

Monger
2007-07-10, 18:58:14
Wird, wenn sich eine Instanz von Threader in operation befindet die Methode komplett gesperrt sodass auch andere Instanzen von Threader diese nicht aufrufen können?

Andere Instanzen von Threader laufen ja nicht durch die selbe, sondern durch ihre eigenen Instanzen dieser Methode, und greifen auch nur auf ihre eigenen Attribute zu. Warum sollten die sich denn gegenseitig behindern?

Also nein, die Methode lockt nicht alle anderen Instanzen davon.

Kritisch wird es dann, wenn mehrere Threader-Instanzen irgendwo das selbe Objekt bearbeiten wollen.

Senior Sanchez
2007-07-10, 19:12:18
Andere Instanzen von Threader laufen ja nicht durch die selbe, sondern durch ihre eigenen Instanzen dieser Methode, und greifen auch nur auf ihre eigenen Attribute zu. Warum sollten die sich denn gegenseitig behindern?

Also nein, die Methode lockt nicht alle anderen Instanzen davon.

Kritisch wird es dann, wenn mehrere Threader-Instanzen irgendwo das selbe Objekt bearbeiten wollen.

Genau das ist der Punkt ;)
Da hatte ich heute ne kleine Diskussion und so habe ich mir das ansich auch gedacht.