parallelStream() кажется тупиковым при вызове из блока static{}

У меня странный тупик, который, кажется, происходит только за пределами main().

    static
    {
        init();
    }

    private static final void init()
    {
        ForkJoinPool forkJoinPool = null;
        try
        {
            forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());
/*A*/       List<Void> list = new ArrayList<>();
            for (int i = 0; i < 100; i++) list.add(null);
            Object obj = forkJoinPool.submit(() ->
            {
                list.stream().parallel().forEach(t ->
                {
/*B*/               System.err.println(1);
                });
                return null;
            }).get();
            System.out.println("no deadlock: " + obj);
        }
        catch (InterruptedException | ExecutionException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (forkJoinPool != null)
            {
                forkJoinPool.shutdown();
            }
        }
    }

Приведенный выше код имеет два результата.

  1. Если я установлю точку останова на /*A*/, а затем возобновлю выполнение, тогда будет напечатано от одной до десяти единиц.
  2. Если я установлю точку останова на /*A*/, а затем перешагну выполнение потока, он напечатает только одну 1.
  3. Если я установлю точку останова на /*B*/, только один поток попадет в точку останова, а при возобновлении (вся программа) будет напечатана только одна 1. Во всех случаях «нет взаимоблокировки» не печатается.

Моя первая мысль заключалась в том, что синхронизированный блок в функции, которую я вызывал, блокировал поток, однако с приведенным выше тестовым кодом это исключено.

Моя вторая мысль заключалась в том, что где-то еще выполнялось что-то, что использует глобальный пул forkjoinpool. Это не так, но на тот случай, если я запустил код в пользовательском пуле forkjoinpool, в результате ничего не будет напечатано, и любые точки останова в пуле forkjoinpool (до выполнения list#parallelstream) не сработают.

Мое окончательное предположение состоит в том, что это вызвано выполнением внутри метода, вызываемого через блок static{}. Если причиной является выполнение этого кода в блоке static{}, то почему?


person jordan t    schedule 10.11.2019    source источник