パラレルラムダを使用すると、次の問題が発生しました。静的な初期化スレッドロックのLambdas
私は静的な初期化ブロックを並列に配列を反復するクラスを持っていますが、最初の反復が正しく完了していることと、後続の反復がすべてブロックされていることがスタックトレースからわかりました。 (スレッドダンプ状態 "Waiting for:")本当に役に立たない。
スレッドがロックするコードは次のとおりです。
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);
}
}
なぜ、配列インデックスをnullに設定すると、スレッドロックが発生するのかという頭が傷つき、私は次のことを思いつきました。 私は静的ブロック内に一時的な配列を作成し、最後に問題を修正したクラス配列を割り当てました。
public static class Test {
private static final Object[] objects;
static {
Object[] tempObjects = new Object[9];
IntStream.range(0, tempObjects.length).parallel().forEach(i -> tempObjects[i] = null);
objects = tempObjects;
}
}
最初のコードブロックスレッドがロックされ、2番目のコードブロックがなぜそうでないのかについての洞察はありますか?
'objects = new Object [9];はあなたの並列ストリームで何をしようとしているのか分かりません。また、9回の簡単な操作を行うための並列ストリームは完全に過剰です。パラレルは「魔法的に速い」という意味ではありません。 –
サイズを定義した後に、すべての要素がnullの場合、nullに初期化するのはなぜですか? – prsvr
「最初の反復が正しく完了し、後続の操作がブロックされます」という意味はどうですか?このコードが呼び出されるのは1回だけです。 – daniu