После нескольких дней борьбы я могу найти решение.Как сказал Майк Лиш, синхронизированный блок пытается уменьшить объем памяти.Но это оказывает значительное влияние на производительность на многоядерном компьютере с большой рабочей нагрузкой синтаксического анализа SQL.Я пытался проанализировать файл 100gb + SQL, созданный mysqldump.
Мое решение заключается в создании пользовательского интерпретатора с клонированным DFA вместо статического.Результат почти в 10 раз лучше на моем 16-ядерном потоке AMD AMD с загрузкой процессора выше 95%.
setInterpreter(new LexerATNSimulator(this, _ATN, getDFA(), new PredictionContextCache()));
private DFA[] getDFA() {
DFA[] result = new DFA[_ATN.getNumberOfDecisions()];
for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
result[i] = new DFA(_ATN.getDecisionState(i), i);
}
return result;
}