Datenstruktur & Synchronisation?

Hallo,

ich hab zwei Fragen an die Profis.

a) WEnn eine meiner Methoden drei Strings zurückliefert, was ist dann 1.) „besseres Java“ und 2.) „wesentlich performanter“:
wenn ich einmal ein String-Array (oder auch ArrayList oder Vector) nehme diese dann drei STring Werte einfach „hintereinander“ enthält,
oder ein Objekt erzeuge das drei String Attribute/Klassenvariablen hat. (Sozusagen eine Bean oder getter und setter methoden mit direktem Zugriff auf die Werte) ?so ein Struct-Datentyp von C?

Ist das das Gleiche? denn ein Array ist ja auch ein Art Objekt? und wenn darin Strings gespeichert sind wäre das ja da gleiche. Gibt es da dennoch irgendwelche Performance Unterschiede zwischen beiden Lösungen? (Ich hoffe es ist klar was ich meine?)

DAnn noch eine Frage. Wenn ich eine Methode komplett synchronisiere, und zehn Instanzen der Klasse bild und jedesmal „mehr oder weniger gleichzeitig“ diese Methode aufrufe, wird die dann synchronsiert oder nicht. Sprich wirkt sich eine Synchronisation immer auf Virtual-Machine Ebene aus (egal wieviele unterschiedliche Instanzen, nur eine Instanz der Klasse hat jeweils Zugriff aud die Methode, oder ist die Synchronisation auf eine Instanz beschränkt? (Würde letzteres überhaupt Sinn machen, kann man von einer Instanz mehr odre weniger gleichzeitig eine Methode aufrufen?)

Vielen Dank
Julian

a) WEnn eine meiner Methoden drei Strings
zurückliefert, was
ist dann 1.) „besseres Java“ und 2.) „wesentlich
performanter“:

Vom Stil her ist es sicher vorzuziehen die drei Strings in eine Klasse zu packen. Damit hast du die Rückgabe genauer deklariert und bist weniger anfällig auf Fehler. Bei einem Array hast du die Anzahl der Elemente nicht genau definiert und wenn du mal zwischendrinnen neue Elemente einschieben willst, dann hat das Seiteneffekte auf den aufrufenden Code.

Solange du nicht in einem hochsensiblen Bereich arbeitest haben die beiden Methoden meiner Meinung nach keinen relevanten Einfluss auf die Performance (zur Not mit Profiler checken).

DAnn noch eine Frage. Wenn ich eine Methode komplett
synchronisiere, und zehn Instanzen der Klasse bild und
jedesmal „mehr oder weniger gleichzeitig“ diese Methode
aufrufe, wird die dann synchronsiert oder nicht.

Nein, wird nicht synchronisiert.

Jeder synchronized-Block verwendet ein bestimmtes Objekt als „Monitor“ für die Synchronisierung. Alle synchronized-Blocks die auf dasselbe Objekt zeigen werden untereinander synchronisiert.

Bei der synchronized-Deklaration einer Methode wird das Objekt zu dem die Methode gehört verwendet. Und in deinem Fall sind das dann 10 verschiedene Objekte.

Wenn du die 10 Methoden in verschiedenen Klassen synchronisieren möchtest, dann musst du ein Monitor-Objekt erzeugen das alle verwenden und statt der synchronized-Deklaration einen Block verwenden.

Kurzes Beispiel:

Du hast:

synchronized myMethod { ... }

Das entspricht:

myMethod
{
 synchronized( this )
 { 
 ... 
 }
}

Du brauchst:

myMethod
{
 synchronized( myMonitorObject )
 {
 ...
 }
}

Wobei myMonitorObject dann für alle deine 10 Instanzen dasselbe Objekt sein muss.

Ich hoffe das hilft dir mal weiter, wenn nicht, dann frag einfach. :smile:

Grüße, Robert

Danke
Hallo Robert,

vielen DAnk für deine ausführliche Antwort, hat mir sehr geholfen!
viele Grüße Julian