Mit Synchronization schuetzt man Daten oder Objekte, die von mehreren Threads gleichzeitig benutzt (geteilt) werden. Hintergrund ist, dass Threads meistens nicht gleichzeitig ablaufen, sondern nur scheinbar gleichzeitig. Das Betriebssytem bestimmt, wann welcher Thread fuer wie lange laeuft. Wenn ein Thread gestoppt wird und ein anderer startet, nennt man das Context Switch. Wann das passiert, weiss der Programmierer nicht. Das kann allerhand Probleme verursachen. Z.B.: das folgende, unschuldige Statement:
i++;
erhoeht den Wert von i um 1. Leider ist diese Operation nicht "atomic", d.h. es sind mehrere Arbeitsschritte noetig:
1. Lies den Wert der Variable i
2. Addiere 1 hinzu
3. Speichere den neuen Wert an der gleichen Adresse
Wenn nun Thread 1 den ersten Schritt gemacht hat (lesen von i), dann kann es sein dass das Betriebssystem einen Context Switch durchfuehrt.
Jetzt liest Thread 2 den Wert von i - der ist immer noch der gleiche!
Dann geht's zurueck zu Thread 1. Der fuegt 1 hinzu und speichert den Wert
Dann wieder zu Thread 2, der mach das auch.
Leider hat sich aber der Wert von i danach nur um 1 erhoeht und nicht wie erwartet um 2, weil beide Threads vom gleichen Anfangswert ausgegangen sind. Und genau fuer diesen Zweck gibt es das Keyword synchronized. D.h. die Operation muss synchronisiert werden, um das obige Scenario zu verhindern:
synchronized (this) {
i++;
}
Das stellt sicher, dass ein Thread alle Schritte ausfuehren kann, ohne unterbrochen zu werden. Thread 1 wuerde also den Wert um 1 erhoehen, Thread 2 wuerde dann diesen neuen Wert lesen und wiederum um 1 erhoehen, was dann das erwartete Resultat bringt. Das ganze Verfahren nennt man dann Synchronization.
Hoffentlich war das nicht zu lang ;o)
Andy