Hi,
Ich habe einen ObjectPool geschrieben. Dieser soll threadsafe sein, wenn ich im Konstruktor true übergebe.
Intern wird dann ein Flag gesetzt (concurrent).
Wenn ich von "außen" ein Objekt aus dem Pool haben möchte, rufe ich die Methode get() auf.
Die Methode ruft dann wenn concurrent true ist, eine Methode getSync() auf, diese ist synchronisiert und ruft wieder die Methode getIntern() auf.
Ist concurrent false, wird direkt die Methode getIntern() aufgerufen.
Code:
Ich hab das ganze jetzt mal getestet, in dem ich mehrere Threads auf einen Pool gleichzeitig die get() Methode aufrufen lasse.
Das Limit für die maximale Anzahl an Elementen ist 50.
Nach die Threads gestartet sind (1000 Threads) lasse ich mir die Anzahl der Objekte im Pool zurück geben. Teilweise kommt dabei sogar sowas wie 390 raus :autsch:
An der Implementierung der getIntern() Methode liegt es nicht. Wenn ich die get() Methode synchronisiert mache, hab ich am Ende immer maximal 50 Instanzen im Pool egal wie viel Threads ich parallel starte.
Ich habe auch mal in der get() Methode vor der Zeile
eine sysout Ausgabe gemacht. Komischerweise wird diese tatsächlich ein paar Mal angezeigt. Wie kann das sein? Es handelt sich immer um das gleiche pool Objekt und da ist das Flag concurrent auf true gesetzt worden im Konstruktor???:L
mfg, Andi
Ich habe einen ObjectPool geschrieben. Dieser soll threadsafe sein, wenn ich im Konstruktor true übergebe.
Intern wird dann ein Flag gesetzt (concurrent).
Wenn ich von "außen" ein Objekt aus dem Pool haben möchte, rufe ich die Methode get() auf.
Die Methode ruft dann wenn concurrent true ist, eine Methode getSync() auf, diese ist synchronisiert und ruft wieder die Methode getIntern() auf.
Ist concurrent false, wird direkt die Methode getIntern() aufgerufen.
Code:
Java:
public T get()
{
//Wenn concurrent -> synchronisiert, sonst normal
if(concurrent)
{
return getSync();
}
return getIntern();
}
private synchronized T getSync()
{
return getIntern();
}
private T getIntern()
{
....
}
Ich hab das ganze jetzt mal getestet, in dem ich mehrere Threads auf einen Pool gleichzeitig die get() Methode aufrufen lasse.
Das Limit für die maximale Anzahl an Elementen ist 50.
Nach die Threads gestartet sind (1000 Threads) lasse ich mir die Anzahl der Objekte im Pool zurück geben. Teilweise kommt dabei sogar sowas wie 390 raus :autsch:
An der Implementierung der getIntern() Methode liegt es nicht. Wenn ich die get() Methode synchronisiert mache, hab ich am Ende immer maximal 50 Instanzen im Pool egal wie viel Threads ich parallel starte.
Ich habe auch mal in der get() Methode vor der Zeile
Java:
return getIntern();
eine sysout Ausgabe gemacht. Komischerweise wird diese tatsächlich ein paar Mal angezeigt. Wie kann das sein? Es handelt sich immer um das gleiche pool Objekt und da ist das Flag concurrent auf true gesetzt worden im Konstruktor???:L
mfg, Andi
Zuletzt bearbeitet: