Я запускаю многопоточную сборку с двумя зависимыми вызовами com.sun.tools.javac.Main.compile (), работающими в отдельных потоках с паузой ~ 10 мс между ними. Каждый сейчас (каждые 100 сборок или около того) второй javac жалуется на неправильные форматы классов в выходных данных первого javac.
Это на linux, но оно должно работать на всех ОС. С какими ограничениями я здесь сталкиваюсь?
Я работаю над параллельной системой сборки, поэтому я вызываю javacs потому, что они находятся в разных модулях. Существует внешняя синхронизация, которая обеспечивает порядок выполнения (но я на самом деле не в синхронизированном блоке, когда я вызываю метод compile ()), и я точно знаю, что они вызываются один за другим, примерно с 10 -20 мс пауза в среднем. Насколько я понимаю, эти два вызова функции compile () должны иметь общий доступ к файловой системе?
Редактировать 2:
Поток, вызывающий второй вызов compile (), находится в wait () до тех пор, пока не завершится первый, поэтому происходит синхронизация по порядку. Но я не в синхронизированном блоке, когда вызываю фактический вызов для компиляции. Компиляция - статический метод, и я предполагаю, что у них нет внутренних проблем безопасной публикации в этом контексте ... (?)
Редактировать 3: Синхронизация вызова compile () не помогает. Так же как и вызовы sync () для Linux. Но я не смотрел в очищающие буферы на уровне Java, если это возможно.