Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Objekt synchronisieren, sodass es nicht von mehreren Threads benutzt wird..?
Ich habe ein Objekt das nicht von mehreren Threads genutzt werden kann. Die getObjekt() Methode habe ich synchronized, aber das haelt glaube ich nicht davon ab, dass 2 Threads sich das Objekt nacheinander holen und GLEICHZEITIG benutzen, was ich verhindern will.
sollte man für sowas nicht die Semaphoren verwenden? So a la:
Hat ein Thread "getObject()" aufgerufen wird das Objekt gesperrt und Thread 1 macht was
mit dem Objekt und danach muss Thread 1 das Objekt wieder freigeben also die
Semaphore wieder hochzählen. Soweit der "klassische" Ansatz.
Aber gibt es seit Java 1.5 nicht verbesserte Mechanismen für sowas? Stichwort:
BlockingQueue, oder so.
Synchronized sorgt nur dafür, dass der im diesem Block befindliche Code wirklich nur von einem Thread durchlaufen wird. In deinem Fall also wirklich nur die getObjekt()-Methode. Sobald diese verlassen wird, kann jeder weitere Thread diese Methode aufrufen.
Es ist wahrscheinlich, dass gar nicht alles an deinem Objekt synchronisiert werden muss, denn durch ein extremes "Alles-ver-sychronized-sieren" kann die Performanz extrem verschlechtert werden.
Egal ob mit dem synchronized-Kommando oder Semaphoren, du musst genau die Bereiche markieren, die ausgeschlossen werden sollen. Geht dieser Bereich über mehrere Strukturelemente, muss man natürlich in Threadabläufen denken. Da eignen sich Semaphoren. Sie sind wesentlich flexibler. Synchronized ist nur innerhalb eines Code-Blocks verwendbar.
Im Prinzip musst du deinen Wunsch entsprechend alle Zugänge zum Objekt einfach nur mit synchronized markieren.
Ich mag Semaphoren auch sehr gern, aber folgendes wäre echt komplizierter:
Vereinfacht kann man natürlich folgendes innerhalb der Klasse schreiben (Pseudocode) :
Code:
Semaphore totalMutex;
public void aquireThis() { totalMutex.aquire();}
public void releaseThis() { totalMutex.release();}
Nun muss, wann immer das Objekt benutzt wird, aquireThis vorher aufgerufen werden und anschließend releaseThis. Da ist dann aufgrund fehleranfälligkeit auf jedenfall AOP zu empfehlen. Allerdings würde ich es so selbst nicht realisieren und lieber die einzelnen kritischen Bereiche raussuchen und zu schauen, was da genau vermieden werden muss.
Am Besten schau dir diverse Grundlagen an über das Thema Threads.