Hashtable gleichzeitigen Zugriff verhindern

Status
Nicht offen für weitere Antworten.

Monkey_D_Ace

Mitglied
Hallo Leute,

hab mal wieder ein Problem das ich nich lösen kann:

Exception in thread "Thread-6" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at GamePanel.moveObjects(GamePanel.java:370)
at GamePanel.run(GamePanel.java:430)
at java.lang.Thread.run(Unknown Source)

Das ist die Exception die ich bekomme. Das komische daran ist dass ich sie einmal schon nach 5 Sek und einmal erst nach 2 min Spielzeit bekomme. hab mal nachgegoogelt und da steht, dass versucht wird von der Hashtable gleichzeitig zu schreiben und davon zu lesen.

Hat jemand ne Idee wie ich das verhindern könnte ohne den Spielverlauf zu stören?

hier noch die zugehörigen Codezeilen:

Code:
private void moveObjects(){
		
		for (Movable mov:actors){			//Aufruf für jedes Movable-Interface in actors
			
			mov.move(delta);				//move aufrufen mit Übergabe delta
		}
	}

und:

Code:
public void run(){

		while(game_running){				
		computeDelta();					

			if(isStarted()){				

				checkKeys();				
				doLogic();					[b]//Aufruf der doLogic-Methode[/b]
				moveObjects();					[b]//Aufruf der moveObjects-Methode[/b]
			}
			
			repaint();					
			
			try{
				
				Thread.sleep(10);		//Thread wird immer für jeweils 10 Millisekunden schlafen gelegt, 
										//damit andere Prozesse nicht zu kurz kommen
			}
			
			catch (InterruptedException e){}	//Exception wird abgefangen aber nicht darauf reagiert
		}
	}
 

Monkey_D_Ace

Mitglied
hier noch die doLogic Methode in der ich den Fehler vermute:

Code:
private void doLogic(){
		
		//Hier werden nicht mehr benötigte Objekte in einen Behälter geschoben
		
		Vector <Sprite> trash = new Vector<Sprite>();				//Erzeugen eines "Abfall-Vectors" für nicht mehr verwendete actors
																	//das passiert bei jedem Aufruf von doLogic, damit der trash Vector immer "geleert" wird
		
		for (Movable mov : actors){									//Schleife läuft für jeden actor einmal durch der Movable implementiert
			
			mov.doLogic(delta);										//für jeden actor wird die doLogic Methode aufgerufen
			Sprite check = (Sprite)mov;								//jeder actor wird in ein Sprite gecastet
			
			if(check.remove){										//wenn dieser entfernt wurde,
				
				trash.add(check);									//wird er zum trash Vector geadded
				score += 50;
				System.out.println(score);
			}
		}

ich hoffe mir kann jemand helfen; danke schon mal im voraus[/quote]
 

y0dA

Top Contributor
Also entweder machst du eine Kopie von dem Objekt über welches du iterierst sowie während der Iteration veränderst oder du versuchst es mal mit einer WeakHashMap - obwohl ich denke dass du um eine deep copy nicht umhin kommst.
 

y0dA

Top Contributor
Da nicht den ganzen Code sehe kann ich es dir nicht sagen, fakt ist du änderst einen Wert über welchen du auch iterierst und dort wo diese Iteration stattfindet solltest du nicht über das original Objekt iterieren sondern eine Kopie derselben anlegen und über jene iterieren.
 

Marco13

Top Contributor
So ist das bei Synchonisationsproblemen - sie treten NIE auf, außer in Vollmondnächten, die auf den 13. eines Monts fallen.

Eine DeepCopy zum Vermeiden dieser Probleme sollte nicht notwendig sein. Wann werden denn Elemente zu den actors hinzugefügt oder entfernt? Genau DIESE Stellen müssen synchronisiert werden, mit den stellen, an denen (lesend und/oder schreibend) auf die Map zugegriffen wird.
 

Monkey_D_Ace

Mitglied
er meckert Zeile 9 der doLogic Methode an;

bin ja noch relativ neu bei Java und eigentlich allen Sprachen... :oops: was ist Synchronisation und wie kann ich etwas synchronisieren?

außerdem ist die andere Stelle gegen die er was hat folgende:

Code:
public void run(){

		while(game_running){										//Überprüfen ob das game_running-Flag auf true gesetzt ist
			
			computeDelta();											//Aufruf der computeDelta-Methode
			
			if(isStarted()){										//Prüfung des isStarted-Flags

				checkKeys();										//Aufruf der checkKeys-Methode
				doLogic();											//Aufruf der doLogic-Methode
				moveObjects();										//Aufruf der moveObjects-Methode
			}
			
			repaint();												//Aufruf der repaint-Methode um wieder von vorne zu beginnen
			
			try{
				
				Thread.sleep(10);									//Thread wird immer für jeweils 10 Millisekunden schlafen gelegt, 
																	//damit andere Prozesse nicht zu kurz kommen
			}
			
			catch (InterruptedException e){}						//Exception wird abgefangen aber nicht darauf reagiert
		}
	}

und zwar den Aufruf der Methode moveObjects(), die folgendermaßen aussieht:

Code:
private void moveObjects(){
		
		for (Movable mov:actors){									//Aufruf für jedes Movable-Interface in actors
			
			mov.move(delta);										//move aufrufen mit Übergabe delta
		}
	}

...jetzt is langsam der ganze Code hier :? aber ich hoffe das hilft

danke schon mal
 

Monkey_D_Ace

Mitglied
Ich hab zwei Vecors in Verwendung:

einen actors-Vector der bei Spielstart angelegt wird und immer existiert; dazu werden immer dann Objekte hinzugefügt wenn ein neues Objekt auf dem Spielfeld erscheint.

und einen trash-Vector der dann erstellt wird, wenn Objekt das Spielfeld verlässt bzw. wenn mein remove Flag für das betrffende Objekt auf true steht. Dann wird das Objekt vom actors zum trash Vector ge-added.

Der trash - Vector wird permanent erstellt und wieder neu erstellt um den Speicherbedarf möglichst gering zu halten.

Die Funktion dazu sthet in der run() unter einer while-Schleife die solange augeführt wird wie das Spiel läuft.
 

Marco13

Top Contributor
Ja, aber wo jetzt was aus dem actors-Vector entfernt wird, oder was am Ende mit dem 'trash' passiert, hast du nicht gesagt.

Das "run" wird wohl (wie es sein sollte) in einem eigenen Thread ausgeführt. In der paintComponent-Methode werden wohl die actors gezeichnet, und diese Methode wird vom Event-Dispatch-Thread ausgeführt. Jetzt kann es passieren, dass der Event-Dispatch-Thread gerade dabei ist, alle actors zu zeichnen, und gleichzeitig in der doLogic-Methode der Inhalt von actors verändert wird - und dann knallt's.

Im Prinzip steht die Lösung hier
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedCollection(java.util.Collection)

It is imperative that the user manually synchronize on the returned collection when iterating over it:

Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized(c) {
Iterator i = c.iterator(); // Must be in the synchronized block
while (i.hasNext())
foo(i.next());
}

Failure to follow this advice may result in non-deterministic behavior.


Auf dein Beispiel übertragen: Überall, wo über 'actors' iteriert wird, oder wo der Inhalt von 'actors' verändert wird, muss ein
Code:
synchronized(actors)
{
    // Beispiel...
    for (Movable mov:actors){                           //Aufruf für jedes Movable-Interface in actors
         mov.move(delta);                              //move aufrufen mit Übergabe delta
      } 
}
Block drum. Eventuell (!) KANN es sinnvoll sein, z.B. für das Zeichnen eine Kopie zu erstellen (z.B. wenn sonst an sehr vielen Stellen das 'synchronized' stehen müßte). Das muss dann aber keine DeepCopy sein, und NUR das Aktualisieren der Kopie muss dann in einen synchronized-Block. Ganz grob (!) sinngemäß so
Code:
Vector actors = new Vector();
Vector paintedActors = new Vector();

private void updatePaintedActors()
{
    synchronized(paintedActors)
    {
         paintedActors.clear();
         paintedActors.addAll(actors);
    }
}

public void run(){
...
         updatePaintedActors();
         repaint();  
...
}

void paintComponent(Graphics g)
{
    synchronized(paintedActors)
    {
        for(Moveable : paintedActors) moveable.paint(...);
    }
}
 

Monkey_D_Ace

Mitglied
danke für die Antwort Marco! :toll:

werd's aber erst morgen ausprobieren können...muss in die Heia und wieder früh raus

meld mich wieder wenns hingehauen hat

bis dann
 

Monkey_D_Ace

Mitglied
morgääähhhnnn!

hab jetz mal ne halbe Stunde getestet und es scheint so als ob es funktionieren würde!!!! :applaus: :applaus: :applaus:

danke an alle für eure Hilfe... da hätt ich alleine wohl gesucht bis ich schwarz geworden wäre :bahnhof:

bis dann
Gruß Ace
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
B Hashtable Java Basics - Anfänger-Themen 3
H Klassen Auf eine Hashtable aus mehreren Klassen zugreifen Java Basics - Anfänger-Themen 12
arti28 Verkaufsautomat Enumerations HashTable Java Basics - Anfänger-Themen 1
D Hashtable Java Basics - Anfänger-Themen 4
K Hashtable mit eigenen Konstruktor Java Basics - Anfänger-Themen 2
K NullPointerException in der Hashtable Java Basics - Anfänger-Themen 4
T Collections Hashtable gezielt auslesen. Java Basics - Anfänger-Themen 13
B HashTable & Strings übergeben Java Basics - Anfänger-Themen 4
A Input/Output Hashtable Ausgabe Java Basics - Anfänger-Themen 1
P Key anhand von Value finden (Hashtable) Java Basics - Anfänger-Themen 3
S Hashtable Java Basics - Anfänger-Themen 2
T Werte in Hashtable neu zuweisen Java Basics - Anfänger-Themen 3
P 2D Welt, Hashtable Java Basics - Anfänger-Themen 5
D Hashtable/Hashmap Java Basics - Anfänger-Themen 2
D In Hashtable suchen Java Basics - Anfänger-Themen 3
yampi Objektsammlung - Hashtable, Vector, Arrays Java Basics - Anfänger-Themen 8
L Hashtable nicht wirklich geeignet für mein Vorhaben? Java Basics - Anfänger-Themen 3
P | zu einer hashtable hinzufügen Java Basics - Anfänger-Themen 7
D java.lang.outofmemoryerror java heap space bei Hashtable Java Basics - Anfänger-Themen 3
D Hashtable Value(Array) in String und dann Ausgeben Java Basics - Anfänger-Themen 23
S Fortsetzung meiner frage (hashtable) danke vorab an alle Java Basics - Anfänger-Themen 3
S BITTE UM HILFE HASHTABLE/import java.util.Hashtable in Ecplipse Java Basics - Anfänger-Themen 12
A Verschachtelte Hashtable ausgeben. Java Basics - Anfänger-Themen 3
D Eine Liste wie ne HashTable, nur mit auslesbaren Key . . . Java Basics - Anfänger-Themen 31
G Hashtable füllen Java Basics - Anfänger-Themen 2
G Gesamte Hashtable ausgeben Java Basics - Anfänger-Themen 3
L Arbeiten mit Vectoren in einer Hashtable Java Basics - Anfänger-Themen 2
A Unterschied zwischen HashMap und Hashtable Java Basics - Anfänger-Themen 20
G Sortierter Hashtable? Java Basics - Anfänger-Themen 3
D Eine abgeänderte Hashtable erstellen Java Basics - Anfänger-Themen 3
K Probleme mit java.util.hashtable Java Basics - Anfänger-Themen 10
G Hashtable -> Ordnerstruktur Java Basics - Anfänger-Themen 10
C Problem mit Hashtable Java Basics - Anfänger-Themen 6
M Hashtable an Datenbank schicken Java Basics - Anfänger-Themen 3
F Hashtable mit String[] als value Java Basics - Anfänger-Themen 2
F invertierung einer Hashtable Java Basics - Anfänger-Themen 4
P HashTable auslesen und in createDocument ausgeben Java Basics - Anfänger-Themen 4
T Warum kann Hashtable get Methode nicht funktionieren? Java Basics - Anfänger-Themen 3
N NullPointerException bei meiner Hashtable Java Basics - Anfänger-Themen 2
M Hashtable oder Hashmap mit Inhalt vorbelegen Java Basics - Anfänger-Themen 2
C Hashtable-get Java Basics - Anfänger-Themen 2
K Hashtable mischen (shuffeln)? Java Basics - Anfänger-Themen 4
H Objekte in einer Hashtable am einfachsten sortieren Java Basics - Anfänger-Themen 13
G Hilfe! Wie Kreise in Hashtable ablegen und wieder auslesen? Java Basics - Anfänger-Themen 2
G unterschied hashtable und hashmap? Java Basics - Anfänger-Themen 3
A Hashtable - 3 Suchmöglichkeiten Java Basics - Anfänger-Themen 4
G hashtable und unsafe, unchecked Code Java Basics - Anfänger-Themen 3
L Hashtable Verständnis Frage Java Basics - Anfänger-Themen 4
R Hashtable ohne Values Java Basics - Anfänger-Themen 5
G Hashtable oder was sonst? Java Basics - Anfänger-Themen 8
S Value von ein Hashtable collectionen Java Basics - Anfänger-Themen 3
S Hashtable & Datei Java Basics - Anfänger-Themen 4
W Hashtable Integer als Value Java Basics - Anfänger-Themen 6
S Hashtable probleme Java Basics - Anfänger-Themen 6
N ein array in der hashtable Java Basics - Anfänger-Themen 6
W Hashtable oder was Anderes Java Basics - Anfänger-Themen 8
I Warum ließt er den Inhalt der Hashtable nicht? Java Basics - Anfänger-Themen 5
G die keys einer Hashtable sortieren Java Basics - Anfänger-Themen 15
D Hashtable gibt eigenartiges wieder Java Basics - Anfänger-Themen 2
G hashtable jeden wert mit trim() bearbeiten Java Basics - Anfänger-Themen 3
K Objekte und deren Anzahl speichern, hashtable? Java Basics - Anfänger-Themen 9
P hashtable Java Basics - Anfänger-Themen 8
V Hashtable ausgeben Java Basics - Anfänger-Themen 4
V Suchen und ausgeben - Hashtable Java Basics - Anfänger-Themen 3
J HashTable Java Basics - Anfänger-Themen 4
G Inhalt einer Hashtable ausgeben Java Basics - Anfänger-Themen 2
A Hashtable als Rückgabewert Java Basics - Anfänger-Themen 3
N maximale Anzahl Schlüssel in einem Hashtable Java Basics - Anfänger-Themen 7
T Hashtable und Vektor Java Basics - Anfänger-Themen 3
R Hashtable wird falsch ausgegeben Java Basics - Anfänger-Themen 5
B Hashtable.containsKey Problem Java Basics - Anfänger-Themen 13
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
H Zugriff verweigert Java Basics - Anfänger-Themen 5
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
B Zugriffsmodifier, Zugriff außerhalb Package Java Basics - Anfänger-Themen 5
C Zugriff auf Attribut von Oberklasse Java Basics - Anfänger-Themen 8
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
S Zugriff auf protected Fields = guter Programmierstil? Java Basics - Anfänger-Themen 11
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
ruutaiokwu Bluetooth-Zugriff, braucht es dazu plattformabhängige Libraries oder kann das Java mittlerweile selbst? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
L Methoden Zugriff <identifier> expected Java Basics - Anfänger-Themen 13
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben