Что такое контракт параллелизма файловой системы javac / java? - PullRequest
2 голосов
/ 17 февраля 2010

Я запускаю многопоточную сборку с двумя зависимыми вызовами com.sun.tools.javac.Main.compile (), работающими в отдельных потоках с паузой ~ 10 мс между ними. Каждый сейчас (каждые 100 сборок или около того) второй javac жалуется на неправильные форматы классов в выходных данных первого javac.

Это на linux, но оно должно работать на всех ОС. С какими ограничениями я здесь сталкиваюсь?

Я работаю над параллельной системой сборки, поэтому я вызываю javacs потому, что они находятся в разных модулях. Существует внешняя синхронизация, которая обеспечивает порядок выполнения (но я на самом деле не в синхронизированном блоке, когда я вызываю метод compile ()), и я точно знаю, что они вызываются один за другим, примерно с 10 -20 мс пауза в среднем. Насколько я понимаю, эти два вызова функции compile () должны иметь общий доступ к файловой системе?

Редактировать 2: Поток, вызывающий второй вызов compile (), находится в wait () до тех пор, пока не завершится первый, поэтому происходит синхронизация по порядку. Но я не в синхронизированном блоке, когда вызываю фактический вызов для компиляции. Компиляция - статический метод, и я предполагаю, что у них нет внутренних проблем безопасной публикации в этом контексте ... (?)

Редактировать 3: Синхронизация вызова compile () не помогает. Так же как и вызовы sync () для Linux. Но я не смотрел в очищающие буферы на уровне Java, если это возможно.

1 Ответ

2 голосов
/ 18 февраля 2010

Что такое файловая система javac / java договор параллелизма?

Нет ни одного. Если вы компилируете класс в потоке A, который нужен другому компилятору в потоке B, этого не должно быть. Все просто.

...