synchronized-wait()?!
2006-01-27 16:12
Lazy
Ich habe eine Frage zu synchronized und wait(). Dazu erstmal ein Stück Programmtext aus dem Skript. Es ist eine Implentation der Pufferverwaltung:
Also ich habe synchronized so verstanden, dass Java dafür sorgt, dass zwei synchronized Methoden (bzw. Blöcke) nicht gleichzeitig ausgeführt werden können. Wenn ich nun aber get() aufrufe und der Puffer ist leer, dann wartet er ja so lange, bis er einen notify bekommt und der Puffer nicht mehr leer ist. wie kann denn aber der Puffer gefüllt werden, wenn die put(Object) Methode auch synchronized ist? Die beiden Methoden können doch gar nicht gleichzeitig ausgeführt werden!? Oder bewirkt wait(), dass nun auch wieder andere synchronized Methoden/Blöcke ausgeführt werden können?
Oder habe ich irgendwas falsch verstanden?
class BufferImpl implements Buffer {
protected Object[] buf;
protected int in = 0;
protected int out = 0;
protected int count = 0;
protected int size;
BufferImpl(int size) {
this.size = size;
buf = new Object[size]
}
public synchronized void put(Object o) throws InterruptException
{
while (count == size) wait();
buf[in] = o;
++count;
in = (in+1) mod size;
notify();
}
public synchronized Object get() throws InterruptException
{
while (count == 0) wait();
Object o = buf[out];
buf[out] = null;
--count;
out = (out + 1) mod size;
notify();
return (o);
}
}
Also ich habe synchronized so verstanden, dass Java dafür sorgt, dass zwei synchronized Methoden (bzw. Blöcke) nicht gleichzeitig ausgeführt werden können. Wenn ich nun aber get() aufrufe und der Puffer ist leer, dann wartet er ja so lange, bis er einen notify bekommt und der Puffer nicht mehr leer ist. wie kann denn aber der Puffer gefüllt werden, wenn die put(Object) Methode auch synchronized ist? Die beiden Methoden können doch gar nicht gleichzeitig ausgeführt werden!? Oder bewirkt wait(), dass nun auch wieder andere synchronized Methoden/Blöcke ausgeführt werden können?
Oder habe ich irgendwas falsch verstanden?