Ich arbeite an einem Android-Spiel und ich habe gerade bemerkt, dass, da onTouchEvent
auf dem UI-Thread läuft und die update / render-Methoden von einem separaten Thread laufen, beide ein ArrayList
aktualisieren, das das enthält Entitäten. Offensichtlich widersprechen sie sich, wenn sie zufällig die Liste gleichzeitig ändern.
Ich habe gelesen, dass die Vector
-Klasse genauso verwendet wird wie ArrayList
, mit dem einzigen Unterschied, dass Vector
synchronisiert ist, also werden sie nicht in Konflikt geraten. Ist das wahr? wenn ja, hat es ein Leistungsproblem oder etwas, worüber ich besorgt sein sollte? Ich habe noch nie Vector
class verwendet.
BEARBEITEN: Was ich eigentlich meinte, war Wechsel von
ArrayList<Obj> list = new ArrayList<Obj>();
bis
Vector<Obj> list = new Vector<Obj>()
Aber wie die Antworten sagen, wird Vector
nicht empfohlen. Die ausgewählte Antwort hat mein Problem gelöst.
Es ist Oldie Vector
versuche nicht, stattdessen Vector zu verwenden
Beispiel:
%Vor%Der Vektor gilt als veraltet und nicht mehr weiterentwickelt. Lesen Sie Why vector is considerer veraltet?
Für diejenigen, die mit Legacy-Code kämpfen müssen, tun Sie Folgendes:
%Vor%sollte funktionieren. Beide dieser Strukturen implementieren List-Schnittstelle.
Aber wie andere Leute vorgeschlagen, wird dies nicht empfohlen.
Wie bereits von nachokk erwähnt, wird synchonizedList
den Trick machen.
synchronizedList
gibt einen Wrapper um die Liste zurück, so dass kein Kopieren ausgeführt wird.
Der Nachteil ist, dass nur ein Anruf zu der Liste gleichzeitig erfolgen kann. Zwei Lesevorgänge in der Liste sind sequenziell, auch wenn sie parallel ausgeführt werden könnten. Synchronisierte Blöcke bedeuten immer einen geringen Overhead und verringern die Leistung, wenn sie oft aufgerufen werden.
Eine andere Option wäre die gleichzeitige Verwendung einer Liste. Dies bedeutet eine Kopie an erster Stelle, aber die Zugriffsleistung könnte erheblich verbessert werden.
Wenn Sie viele Leseanfragen haben (z. B. für Gemälde), ist eine CopyOnWriteArrayList
eine gute Wahl. Lesevorgänge sind fast so schnell wie eine normale ArrayList und werden nicht blockiert. Schreibvorgänge in die Liste sind sequentiell und teuer, da sie das gesamte Array kopieren müssen.
Ein weiterer guter Punkt für CoWarrayList ist, dass Sie iterieren können, ohne eine ConcurrentModificationException abzufangen. Der Iterator, der von iterator()
zurückgegeben wird, verwendet immer dasselbe Backward-Array, auch wenn die Liste geändert wurde.