У меня странный тупик, который, кажется, происходит только за пределами 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();
}
}
}
Приведенный выше код имеет два результата.
- Если я установлю точку останова на
/*A*/
, а затем возобновлю выполнение, тогда будет напечатано от одной до десяти единиц. - Если я установлю точку останова на
/*A*/
, а затем перешагну выполнение потока, он напечатает только одну 1. - Если я установлю точку останова на
/*B*/
, только один поток попадет в точку останова, а при возобновлении (вся программа) будет напечатана только одна 1. Во всех случаях «нет взаимоблокировки» не печатается.
Моя первая мысль заключалась в том, что синхронизированный блок в функции, которую я вызывал, блокировал поток, однако с приведенным выше тестовым кодом это исключено.
Моя вторая мысль заключалась в том, что где-то еще выполнялось что-то, что использует глобальный пул forkjoinpool. Это не так, но на тот случай, если я запустил код в пользовательском пуле forkjoinpool, в результате ничего не будет напечатано, и любые точки останова в пуле forkjoinpool (до выполнения list#parallelstream) не сработают.
Мое окончательное предположение состоит в том, что это вызвано выполнением внутри метода, вызываемого через блок static{}
. Если причиной является выполнение этого кода в блоке static{}
, то почему?