Problem mit Synchronisierung

_Andi91

Bekanntes Mitglied
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:

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:
S

SlaterB

Gast
deine Erläuterungen sind ziemlich nichtssagend (du beschreibst dein Problem ja, aber alles zu 'müsste doch so und so sein' ist nicht begründet/ nachprüfbar),
dein Code beliebig, hängt alles vom Rest ab,

du müsstest nur ein lauffähiges Programm posten und schon könnte alles zu 100% exakt getestet werden, fertig
 
Zuletzt bearbeitet von einem Moderator:

_Andi91

Bekanntes Mitglied
mh ok, dachte es ist vielleicht auch so verständlich genug.
Hab die Sourcen angehängt

EDIT: Die Methode getIntern() in der klasse ObjectPool ist eigentlich nicht synchronized. Ist aus Testzwecken falsch in der Klasse im Anhang
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ziemlich frech, zum Glück ein Thema der interessanteren Sorte,
bei mir kommt es nicht zu 390, nur selten mal zu 51 oder 52 statt 50,

ich denke es liegt am hinteren Teil von getIntern():
Java:
 // kein freies object gefunden
        if (obj == null)
        {
            // Noch platz im Pool -> neues Object erzeugen und dem Pool hinzufuegen
            if (poolObjects.size() < poolMethodsImpl.getMaxSize())
            {
                obj = new PoolObject<T>(poolMethodsImpl.getNewObj(), true);
                poolObjects.add(obj);
            }
dort werden neue Objekte erzeugt, ohne Synchronisation können bei 49 vorhandenen Objekten gerade mehrere Threads das if mit der size-Prüfung passieren, bevor der erste von diesen das 50. Objekt erzeugt
-> die anderen Threads fügen auch noch ein, die maximale Size wird überschritten,

besonders deutlich wird es, wenn du Thread.sleep(500); in das if vor dem add() einbaust, durch die lange Wartezeit schaffen es alle Threads in das if hinein, am Ende ist die size 1000,

in der main-Methode solltest du auch eine gewisse Wartezeit vor der Ausgabe der size() einbauen, sonst kann dort ein Stand ausgegeben werden, bevor überhaupt alle Threads durch sind,
Ausgabe 0 habe ich teilweise auch
 

_Andi91

Bekanntes Mitglied
ich denke es liegt am hinteren Teil von getIntern()
dort werden neue Objekte erzeugt, ohne Synchronisation können bei 49 vorhandenen Objekten gerade mehrere Threads das if mit der size-Prüfung passieren, bevor der erste von diesen das 50. Objekt erzeugt
-> die anderen Threads fügen auch noch ein, die maximale Size wird überschritten,

besonders deutlich wird es, wenn du Thread.sleep(500); in das if vor dem add() einbaust, durch die lange Wartezeit schaffen es alle Threads in das if hinein, am Ende ist die size 1000,

Stimmt zwar aber im Prinzip aber der Block bzw. die gesamte getIntern() Methode ist schon synchronisiert. Vorraussetzung ist halt, dass sie von der getSync invoked wird und nicht direkt über get().
Aber so war es, weil concurrent nicht gesetzt wurde und somit immer die Methode getIntern() direkt über get() ohne synchronisation invoked wurde.
 
S

SlaterB

Gast
das war doch auch dein Ziel oder? dass man getIntern() ohne Synchronisation ausführen kann?
wenn concurrent immer an ist, brauchst du gar nicht erst das Klassenattribut/ die Unterscheidung

wenn es aber irgendeine Möglichkeit gibt, getIntern() ohne Synchronisation ausführen, dann hast du eben durch das Einfügen ein Problem,
ist dir vielleicht auch klar, nur dann ist die ursprüngliche Frage, die das Hinzufügen im getIntern() überhaupt nicht thematisiert hat, etwas merkwürdig, was wolltest du überhaupt wissen? ;)
 
Zuletzt bearbeitet von einem Moderator:

_Andi91

Bekanntes Mitglied
Glaub wir reden grad bissl aneinander vorbei ;)

Hast es schon richtig verstanden.
Aber bei dem Konstruktor Aufruf mit dem boolean hab ich diese Zeile vergessen
[XML]this.concurrent = concurrent;[/XML]

Deswegen war concurrent immer auf false und deswegen kam es zu dem Problem, dass zu viele Instanzen hinzugefuegt werden können, weil die getIntern() nie synchronisiert aufgerufen wurde.
 

Kr0e

Gesperrter Benutzer
Ich wuerde es schoener und globaler machen: Erwarte als Parameter eine Instanz vom Typ Lock. Wenn nich synchronisiert wird, uebergibts du ein Dummy-Lock ohne Funktion. SO kannst du alle Klassen die du schreibst immer grundsaetzlich synchronisiert entwickeln und wenn dann mal Sync angebracht ist, nimm einfach ein Reentrantlock und zack ! Flexibler gehts nicht ;)
 

_Andi91

Bekanntes Mitglied
Mh ob das so schöner wäre?
für den Benutzer der Klasse macht es ja keinen grossen Unterschied, ob ich jetzt ein ReentrantLock im Konstruktor übergeben muss oder einen boolean. Ich bräuchte halt keine drei Methoden mehr und müsste nur noch in der get() am Anfang lock und am Ende unlock machen.
Dafür bräuchte man aber noch die Dummy Implementierung von Lock.
Also ich finde schöner ist des auch nicht unbedingt.

Was mir aber besser gefällt, ist weiterhin die Übergabe eines boolean und dass dann je nachdem intern entweder ein Dummy Lock oder ein ReentrantLock gesetzt wird.
 

Kr0e

Gesperrter Benutzer
Es ist auf jeden Fall flexibler, wenn du die boolean-Uebergabe os magst, dann kannst du noch nen dritten Konstr. machen.
Das beste ist, dass deine Klassen dadurch super strukturiert werden. Hast du hinterher mal die Notwendigkeit, dass dein Object einen existieren Lock nutzt von einer Liste zB. dann kannste einfach deren Lock nehmen. Aber diese if boolean Technik ist natuerlich ausreichend. Wollte das nur mal als kleinen Gedankenansatz in den Ring werfen fuer allgemeine Programmoptimierung...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem mit der Synchronisierung von Threads Allgemeine Java-Themen 15
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
K Threads RAM Problem Allgemeine Java-Themen 20
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
C Int Problem Allgemeine Java-Themen 8
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
C Webseiten Programm problem Allgemeine Java-Themen 5
M LocalDate Problem Allgemeine Java-Themen 4
J "Problem Objektorientierung" Allgemeine Java-Themen 20
geekex Problem Meldung! Was tun?! Allgemeine Java-Themen 19
T Klassen Override Problem Allgemeine Java-Themen 7
L Unbekanntes Problem Allgemeine Java-Themen 1
FrittenFritze Problem mit einer JComboBox, Event temporär deaktivieren Allgemeine Java-Themen 11
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
F HTTPS Zertifikat Problem Allgemeine Java-Themen 3
M OpenCV KNearest Problem Allgemeine Java-Themen 0
Tommy Nightmare Project Euler: Problem 22 Allgemeine Java-Themen 2
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1
RalleYTN META-INF/services Problem Allgemeine Java-Themen 3
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1

Ähnliche Java Themen


Oben