Gibt es eine saubere und effiziente Möglichkeit, ein Atomic(Double|Integer|Long|Reference)Array
zu wachsen? In meinem speziellen Fall gibt es keine gleichzeitigen Schreibvorgänge während des Kopierens. Ein offensichtlicher Weg, um einen neuen und kopieren Sie den Quell-Array an den Ziel-Array in einer Schleife zu erstellen:effizient wachsende atomare Arrays
Atomic*Array dest = new Atomic*Array(newSize);
for (int i = 0, len = src.length(); i < len; ++i)
dest.set(i, src.get(i));
Dieser Code ist wahrscheinlich viel langsamer als eine System.arraycopy
oder Arrays.copy
Typ Funktion und ist auch ein bisschen ausführlicher.
I Reflexion abwechselnd die Quelle des verwenden könnte array
Feld zu bekommen, verlängern sie, und das neue Array in das Array-Konstruktor Atomic * übergeben:
try {
Field arrayField = Atomic*Array.class.getDeclaredField("array");
arrayField.setAccessible(true);
ArrayType srcArray = (ArrayType)arrayField.get(src);
Atomic*Array dest = new Atomic*Array(Arrays.copyOf(srcArray, newLength));
} catch (IllegalAccessException | NoSuchFieldException e) {
throw new AssertionError(e);
}
Aber dieser Code hat auch Probleme: es über die Umsetzung hängt der Klasse, macht zwei Kopien des Arrays - eine in Arrays.copy
und eine in dest
Konstruktor, und ist sehr hässlich.
Gibt es einen schnelleren/saubereren Weg, dies zu tun?
Verbunden: http://StackOverflow.com/Questions/9408112/get-the-array-from-anatomiclongarray –
Sie können wachsen, indem Sie vom alten zum neuen Array verbinden, damit Verbraucher durchqueren können. Siehe JCTools '[MpscChunkedArrayQueue] (https://github.com/JCTools/JCTools/blob/master/jctools-core/src/main/java/org/jctools/queues/MpscChunkedArrayQueue.java) für ein Beispiel dieser Idee. –
@BenManes Ja, ich dachte an diese Idee, aber dann ist die Speichernutzung wesentlich höher, da wir Arrays in Links einbinden müssen, und die Logik ist etwas komplexer, weil wir einen ungefähren Tail-Zeiger beibehalten müssen. Da die Dinge anständig mit einem einzigen Array funktionieren, möchte ich so viel Leistung wie möglich aus dieser Methode herausholen. –