Ich stieß auf das folgende Problem, wenn Sie parallele Lambdas verwenden.Lambdas im statischen Initialisierer Threadlocking
Ich habe einen statischen Initialisierungsblock in einer Klasse, die parallel über ein Array iteriert, aber ich bemerkte aus dem Stack-Trace, dass die erste Iteration korrekt abgeschlossen und Computer, jedoch alle nachfolgenden Iterationen blockieren. (Thread-Dump gibt "Warten auf:" an), was wirklich nicht hilfreich ist.
Hier ist der Code, der Thread sperrt.
public static class Test {
private static final Object[] objects;
static {
objects = new Object[9];
IntStream.range(0, objects.length).parallel().forEach(i -> objects[i] = null);
}
}
Nachdem einige am Kopf kratzen, warum ein Array-Index Einstellen einer Gewindesicherung auf null I mit der folgenden kam verursachen würde. Ich habe ein temporäres Array innerhalb des statischen Blocks erstellt und dann am Ende das Klassen-Array zugewiesen, das das Problem behoben hat.
Hat jemand einen Einblick, warum der erste Codeblock Thread sperrt und der zweite Codeblock nicht?
Ich hoffe, Ihnen ist bewusst, dass nur 'objects = new Object [9];' das tut, was Sie mit Ihrem parallelen Stream zu tun versuchen. Außerdem ist ein paralleler Strom, der neunmal eine triviale Operation ausführt, völlig übertrieben. Parallel bedeutet nicht "magisch schneller". –
Warum würden Sie ihn auf null initialisieren, wenn alle Elemente null sind, nachdem Sie die Größe definiert haben? – prsvr
Was meinst du "die erste Iteration wird korrekt abgeschlossen, nachfolgende Operationen blockieren"? Es gibt nur ein einziges Mal, dass dieser Code aufgerufen wird. – daniu