# Was bedeutet synchronized?



## ByteRider (1. Jun 2004)

Hallo zusammen,

ich bin ein ziemlicher Neuling im Java-Applet programmieren.
Meine Frage lautet, wie funktioniert Synchronized ? Bzw. was macht es genau ?

Wenn ich eine Methode habe ...

z.B. 
-------------------------------------
int global=0;

synchronized void Test() {
   int priv=1;
   priv++;
   global=v+1;
   Test2();
}

private void Test2(){
 global++;
}
-------------------------------------
bedeutet es, 
* dass Test() nur EINMAL aufgerufen werden kann ( ich meine NACHEINANDER, einzeln
* in dieser Zeit, in der es aufgerufen wurde nicht auf die Variablen "v" und "b" zugegriffen werden kann ?
* Ist Test2(); automatisch auch Synchronized ?? 
* Kann Test2() die Variablen in Test ändern, da es praktisch durch Test aufgerufen wurde ???
* Wie lange ist Test() gesperrt, bis Test2 zurückkehrt ??

Ich werde aus den Dokumentationen nicht schlau.
In einem Buch steht, dass es nur FÜR Methoden gesperrt wird, die ihrerseits synchronized sind .. ???


SORRY für diese Anfängerfragen ! Aber leider blicke ich durch die Dokus nicht durch ?!



Gruß

Andy


----------



## L-ectron-X (1. Jun 2004)

Das Schlüsselwort macht eine Methode oder einen Programmabschnitt Thread sicher. Wenn Du vor hast Deine Methode von verschiedenen Threads aufrufen zu lassen, schreibst Du syncronized davor. Wenn nun ein Thread einen solchen Bereich betritt, wird dieser Bereich für andere Threads, die auch darauf zugreifen möchten für diese Zeit gesperrt, so dass die Daten einer Klasse konsistent bleiben.


----------



## ByteRider (1. Jun 2004)

bleiben denn dann die Variablen gesperrt ?
Die Globale , etc. ?? ( siehe Fragenkatalog oben ?? )


Also benötige ich es z.B. wenn ich einige Veränderungen in der "update" und "repaint" methode
vornehme ?

als Beispiel :

Ich habe eine globale Variabel ...

---------------------
boolean Teil=false;

public update(....) {
  if (teil) { .. nur teilbereich neuzeichnen ... }
  else { .. allles neuzeichnen ... }
}

public paint(..) {  zeichenmethoden }

---------------------

Ich habe ein Applett mit einem MouseMotionListener... Immer wenn die Maus bewegt wird,
werden Koordinaten überprüft und je nach dem der mit PAINT ausgegebene Text mit einem
farbigen Viereck hinterlegt.
Da es bei schnellen Mausbewegungen flackert, habe ich es so verändert, dass nur die betreffende 
Zeile gelöscht und neu gezeichnet wird.
Hierzu wird die Variable teil auf TRUE gesetzt.

Wenn aber ein Steuerelement betätigt wird, muss der gesamte Bereich neu gezeichnet werden,
dazu wird die Variable teil auf FALSE gesetzt.

Das Problem ist, wenn das Steuerelement betätigt wird, wird in einem ungünsigen Fall auch
die Maus bewegt. Beide Aktionen kommen sich ins Gehege.

Ich muss also irgendwie mit SYNCHRONIZE arbeiten, dass immer ein komplettes Zeichnen oder
teil Zeichnen komplett ohne Störung abgearbeitet wird.

Hierzu müsste ich GENAU wissen, wie synchronized arbeitet

Gruß

Byte


----------



## nollario (1. Jun 2004)

Methode synchronized:


```
public synchronized void...
```
dann ist das objekt, zu dem die methode gehört gelocked! (bei static methoden ist das klassen
objekt gelocked (this.class)


Block synchronized:


```
synchronized (obj){...}
```

hier ist das angegebene objekt gelocked...


----------



## ByteRider (1. Jun 2004)

ich bin leider kein Profi, wie gesagt Anfänger.

Ich weiß nicht, wass diese Aussage bedeutet !

Gruß

Byte


----------



## Reality (1. Jun 2004)

Vielleicht hilft das etwas weiter:
http://www.java-forum.org/de/viewtopic.php?t=4987

Die Variablen in der synchronized-Methode werden natürlich auch gesperrt.

Liebe Grüße
Reality


----------



## Guest (1. Jun 2004)

nur die Variablen, die in der Synchronized initialisiert wurden oder auch die globale Variabel ?
Was ist mit der Methode die dort aufgerufen wird ??

Gruß

Byte


----------



## Reality (1. Jun 2004)

Wenn eine Instanz von einer Klasse zugreift beispielsweise  Instanz/Variable a, dann sind alle Methoden und Variablen (auch global) von dieser gesperrt, wenn sie in einer synchronized-Methode aufruft.

Ich habe dir den Link geschickt, wo Beni es mir erklärt hat.


> Wenn eine Methode synchronized ist, wird das ganze Objekt gesperrt, bis diese Methode ausgeführt wurde.
> Also "a.foo" sperrt das ganze a, "b.bar" sperrt das ganze b...



Liebe Grüße
Reality


----------



## meez (2. Jun 2004)

So kann man relativ einfach Threads gegeeinander Verriegeln....
Du kannst es aber z.B.. auch mit Semaphoren machen.


----------

