Wenn wir grade beim Thema sind, Danke, spreche Java fliessend, wäre übrigens an einer Cocoa-Session in der Schweiz (z.B. im Winter, wenn man sich auf die Bretter stellen kann) SEHR interessiert!!!!
Vorschuss: Auch wenn das nur für Leute interessant ist, die sich auf Java einen runterholen können:
Du hast einen Singleton in einem Server laufen, der sicherstellen muss, daß keine schreibenden und lesenden Zugriffe auf ein und das selbe Objekt (das Du aber nicht synchronisieren kannst, da es sich z.B. um ein persitentes Objekt handelt) gleichzeitig passieren, aber das muss so granular passieren, daß es bei massiv parallelen Zugriffen niemals passieren darf, daß Threads geblockt werden, die Daten anfassen, die gar nix miteinander zu tun haben.
Also: Stell Dir einen komplexen Baum von Daten vor, die assynchron geschrieben und gelesen werden können. Der "DataDescriptor" sagt Dir, wo im Baum die Daten versteckt sind, "Data" ist ein Roboter, der einen Chip zum Lachen braucht (und nicht 60 Liter Weiglathaler Bier

) - ne, halt die Daten, also whatever.
Interface-Methoden:
+getData(DataDescriptor descr): Data
+setData(DataDescriptor descr, Data data): void
Implementierung:
+setData(DataDescriptor descr, Data data)
schaut so aus:
Code:
public void setData(DataDescriptor descr, Data data) {
try {
synchronized(xPathHashMap.get(descr).block()) {
setzeData(descr, data);
}
finally {
xPathHashMap.get(descr).unblock()
}
}
und die Abfrage:
Code:
+getData(DataDescriptor descr): Data
public Data getData(DataDescriptor descr) {
try {
synchronized(xPathHashMap.get(descr).block()) {
return holeData(descr);
}
}
finally {
xPathHashMap.get(descr).unblock()
}
}
Du musst dabei beachten, daß "xPathHashMap.get(DataDescriptor).block()" niemals null zurückliefert, da es sonst zu einer Laufzeitexception kommt, also sollte die HashMap geeignete Lockobjekte zurückliefern. Ausserdem sollte die Hashmap 'vergesslich' sein, also nur Softreferences verwenden, die Zugriffe darauf natürlich synchron. Beim Block wird ein Flag gesetzt, daß der Hashmap sagt, daß die Referenz nicht weggeschmissen werden darf, bei unblock() darf aufgeräumt werden. Der Returntype ist Object
Damit kannst Du gewährleisten, dass unterschiedliche Threads niemals gleichzeitig auf die gleichen Daten zugreifen, was möglich wird durch das ansonsten eher unhandliche Monitor-Konzept von Java.
btw: Hat nix oder wenig mit dem ursprünglichen Problem zu tun...