vector, synchronized und mehrere methoden

Status
Nicht offen für weitere Antworten.
K

klaus dieter

Gast
hallo zusammen,

ich bin gerade dabei ein programm in java zu realisieren, bei dem es einen vector existiert, in dem so ziemlich alle daten gespeichert werden.
diesen vector habe ich ein eine separate klasse gepackt und verschiedene methoden zum schreiben in den vector, lesen aus den vector und suchen im vector implementiert.
nur bin ich mir jetzt nicht ganz sicher, das meine gedanken zur sicherstellung der zugriffe richtig ist. denn ich muss 100% sicherstellen, das nicht zwei von diesen methoden gleichzeitig auf diesen vector zugreifen können. nun bin ich einfach mal hingegangen und habe alle methode mit synchronized definiert.
aber wenn ich mir das jetzt so recht überlege, weis ich nicht recht, ob das ausreicht.

denn wenn suchfunktionen zum beipsiel den vector durchsuchen, ist das ja nur eine anreihung von get methoden des vectors. diese sind zwar schon von der definition der vector-klasse synchronizert, aber reicht das ???
um die suche zu realisieren, habe ich eine for-scheife definiert, die abbricht, wenn i vec.size() erreicht hat. das ist ja noch alles ok. nun ist es aber theoretisch möglich, das von einem anderem object die methode zum hinzufügen eines element zu dem vector aufgerufen wird, solange der vector noch durchsucht wird und schon stimmt doch die größe des ermittelten vec.size() nicht mehr und die suchfunktion stimmt nicht mehr.

kann ich irgendwie sicherstellen, das nur eine methode der klasse aktiv aufgerufen werden kann oder gibt es da vielleicht noch eine ganz andere möglichkeit dafür???

für jede hilfe bei diesem problem bin ich sehr dankbar...
 

mariopetr

Bekanntes Mitglied
bis tiger
Code:
public class AClass
{
	public Vector vector;
.
.
public void foo()
{
	synchronized(vector)
	{
		//hier ist exclusives lesen/schreiben moeglich
	}
}
public void bar()
{
	synchronized(vector)
	{
		//hier ist auch exclusives lesen/schreiben moeglich
	}
}
}

ab tiger sollte man eine implementierung von lock (uu mit conditions) beutzen.
 

René Link

Aktives Mitglied
Hi,

warum macht ihr euch so ein Umstand?
Wenn ich die Frage richtig verstanden habe,
denkst du, dass bei einer for-Schleife die Abbruchbedingung
nicht mehr stimmt falls ein anderer Thread den Vector verändert.

Das ist nicht ganz richtig.
Also folgender Code
Code:
for(int i = 0; i < vector.size(); i++){

    Object obj = vector.elementAt(i);
}

Die Methoden im Vector sind folgendermaßen implementiert
Code:
    public synchronized int size() {
	return elementCount;
    }

    public synchronized boolean add(Object o) {
	modCount++;
	ensureCapacityHelper(elementCount + 1);
	elementData[elementCount++] = o;
        return true;
    }

    public boolean remove(Object o) {
        return removeElement(o);
    }

    public synchronized boolean removeElement(Object obj) {
	modCount++;
	int i = indexOf(obj);
	if (i >= 0) {
	    removeElementAt(i);
	    return true;
	}
	return false;
    }

Bei jedem Schleifendurchlauf wird size() erneut aufgerufen. Wenn inzwischen
ein anderer Thread ein Objekt hinzugefügt hat, bekommt die Schleife die Änderung mit.

Das einzigste Problem kann entstehen, wenn ein Thread ein Objekt entfernt.
Nehmen wir an du hättest 5 Elemente im Array. Deine index-Variable der Schleife
zeiget auf das Erste.

Code:
# <
#
#
#
#

Der Schleifenkörper wird ausgeführt und das erste Element gelesen.

Code:
+ <
#
#
#
#


Jetzt kommt der nächste Schleifendurchlauf. Die Bedingung ist war, da sich die größe nicht
geändert hat. Also wird die Index-Variable um eins hochgezählt.

Code:
+
# <
#
#
#

Wenn jetzt ein zweiter Thread an die Reihe kommt und das erste Element entfernt,
überspringt die for-Schleife ein Element. Weil das Element auf Position 2, auf das die
Index-Variable zeigt, auf die freigewordene Position 1 geschoben wird.

Code:
2. Thread löscht 1. Element

#
# <
#
#

Wenn du diesen Fall auch ausschließen willst kommst du nicht drumherum die for-Schleife
zu synchronisieren.

Code:
synchronized (vector) {
  for(int i = 0; i < vector.size(); i++){

     Object obj = vector.elementAt(i);
  }
}

Ansonsten würde ich die Vector-Klasse einfach benutzen. Um so mehr synchronisierte Blöcke oder Methoden
du hast, desto mehr Verwaltungsaufwandt muss die Java-VM bearbeiten. Die Performance leidet also
darunter. Daher -> nur soviel synchronisieren wie nötig - nicht wie möglich.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Vector Strings in Array splitten Allgemeine Java-Themen 6
G Fehler mit Vector Allgemeine Java-Themen 3
M String Array Vector komprimieren und verschicken Allgemeine Java-Themen 3
P Vectorelemente in einen anderen Vector kopieren Allgemeine Java-Themen 12
U Vector aus Oberklasse spezialisieren Allgemeine Java-Themen 2
R Vector in JList Allgemeine Java-Themen 11
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
H Index Out of Bounds bei Vector Allgemeine Java-Themen 4
H Java Vector Frage Allgemeine Java-Themen 9
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
C Vector/Point-Problem Allgemeine Java-Themen 3
M Buffer-Vector einzeln und zusammen synchronisieren Allgemeine Java-Themen 4
B Suchalgorithmus der Klasse Vector Allgemeine Java-Themen 5
X Vector Allgemeine Java-Themen 3
S 2D Vector speziell ausgeben. Allgemeine Java-Themen 2
S Vector in Vector gespeichert, wie greift man darauf zu? Allgemeine Java-Themen 3
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
R Vector.clear() oder neu initialisieren Allgemeine Java-Themen 3
S vector & strings Allgemeine Java-Themen 26
X Vector in Intervall-Menge umwandeln Allgemeine Java-Themen 4
D Array oder Vector in Enum Deklarieren Allgemeine Java-Themen 3
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
G JComponent in Vector - wie klonen? Allgemeine Java-Themen 7
V Performancefrage int-Vector/Stack Allgemeine Java-Themen 10
N HashMap<String,Vector<String>> a = new HashMap<String,Vector<String>>(); Allgemeine Java-Themen 4
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
S JList in Vector Allgemeine Java-Themen 3
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
MQue Vector<..> nicht verwenden Allgemeine Java-Themen 4
H Vector<Character> zu char[] castern Allgemeine Java-Themen 2
T Element aus Vector entfernen Allgemeine Java-Themen 4
Spot84 Vector nach Ressourcetyp sortieren Allgemeine Java-Themen 4
M get Funktion von Vector Allgemeine Java-Themen 4
N wie greife ich auf hashmap in vector zu Allgemeine Java-Themen 9
V NullPointerException bei Vector Allgemeine Java-Themen 2
E einfache Frage zu Vector Allgemeine Java-Themen 8
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
G Vector beim Initialisieren befüllen Allgemeine Java-Themen 4
G Vector addAll Allgemeine Java-Themen 5
B sorteiren von Datein nach Zeitstempel in einem Vector Allgemeine Java-Themen 5
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
MQue Vector Allgemeine Java-Themen 7
F Vector in eine Datenbank speichern? Allgemeine Java-Themen 3
P Vector auf JTree Allgemeine Java-Themen 6
P dynamisches Array / Vector Allgemeine Java-Themen 2
P JTable/Vector Allgemeine Java-Themen 5
T Vector und remove? Allgemeine Java-Themen 13
T Vector in JAVA ? Allgemeine Java-Themen 10
P Vector in vielen Klassen Allgemeine Java-Themen 21
MQue Vector implementieren Allgemeine Java-Themen 2
MQue Vector<State> Allgemeine Java-Themen 2
O hilfe bei Vector frage Allgemeine Java-Themen 6
F Synchronisation + Vector/ArrayList/LinkedList Allgemeine Java-Themen 7
Z Elemente in Vector nach Häufigkeit sortieren. Allgemeine Java-Themen 13
H java.util.Vector langsam ? Allgemeine Java-Themen 5
H Vector<T>[] vecs = new Vector<T>[10]; geht nicht Allgemeine Java-Themen 2
N Java API java.util.vector Allgemeine Java-Themen 3
G Vector erweitern Allgemeine Java-Themen 4
S Vector sortieren nach Objekt-Info? Allgemeine Java-Themen 9
A Probleme mit Vector Allgemeine Java-Themen 6
M Vergleich im geordeten Vector und Methodenaufruf Allgemeine Java-Themen 2
J Vector - Wert ersetzen Allgemeine Java-Themen 14
J Vector - Boolean Allgemeine Java-Themen 24
M Vector zu einem byte[] Allgemeine Java-Themen 5
J Vector<Shape> Speichern [gelöst] Allgemeine Java-Themen 11
Y Array mit ID in Vector Allgemeine Java-Themen 6
T Vector <-> double Allgemeine Java-Themen 4
T ArrayList bzw. Vector per set-Methode? Allgemeine Java-Themen 3
T ArrayList oder Vector als Parameter? Allgemeine Java-Themen 7
M Vector add() unchecked? Allgemeine Java-Themen 5
M Probleme und Zeitdruck: Kunden-DB (Vector) Allgemeine Java-Themen 13
T Vector Array Allgemeine Java-Themen 5
M Kunden-DB mit Vector Allgemeine Java-Themen 9
J Vector sortieren Allgemeine Java-Themen 3
M Vector - contain Allgemeine Java-Themen 13
C String und char[] / String[] und Vector Allgemeine Java-Themen 21
N Vector -> 2Diminsonaler Array Allgemeine Java-Themen 10
N Alledateien in einem Ordner in ein Vector speichern Allgemeine Java-Themen 19
K Object nach Vector konvertieren Allgemeine Java-Themen 3
Z ResultSet in Array oder Vector schreiben! Allgemeine Java-Themen 2
C vector von vector sortieren Allgemeine Java-Themen 4
D Vector in String Allgemeine Java-Themen 5
J Von Collection zu vector Allgemeine Java-Themen 5
D Vector in Datei schreiben Allgemeine Java-Themen 18
I Vector serialisieren: StackOverflow Allgemeine Java-Themen 13
H Vector in ein File-Array umwandeln Allgemeine Java-Themen 2
J User Klasse in den Vector, Object Klasse wieder raus... Allgemeine Java-Themen 4
J Synchronized Probleme Allgemeine Java-Themen 7
D ReentrantLock oder Synchronized ? Allgemeine Java-Themen 3
B Threads synchronized Allgemeine Java-Themen 3
OnDemand Threads und synchronized Allgemeine Java-Themen 9
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
J yield() Aufruf in einer synchronized-Methode Allgemeine Java-Themen 13
A Frage zu Synchronized Allgemeine Java-Themen 5
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
R synchronized methode rekursiv aufrufen Allgemeine Java-Themen 5
P synchronized Allgemeine Java-Themen 4
S komplexe synchronized bedingungen Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben