2

我正在运行一个多线程构建,其中两个依赖的 com.sun.tools.javac.Main.compile() 调用在单独的线程上运行,它们之间有大约 10 毫秒的暂停。每隔一段时间(大约每 100 次构建),第二个 javac 都会抱怨第一个 javac 输出中的类格式错误。

这是在 linux 上,但它必须适用于所有操作系统。我在这里面临的限制是什么?

我正在开发一个并发构建系统,所以我调用 javacs 的原因是因为它们位于不同的模块中。有确保运行顺序的外部同步(但当我调用 compile() 方法时,我实际上并没有在同步块内),而且我确信它们被一个接一个地调用,大约 10平均暂停 -20 毫秒。就我所知,这两个对 compile() 的调用真的应该只共享文件系统吗?

编辑 2:调用第二个 compile() 调用的线程处于 wait() 状态,直到第一个调用完成,因此存在顺序同步。但是当我调用实际的编译调用时,我不在同步块内。编译是一种静态方法,我假设他们在这种情况下没有任何内部安全发布问题......(?)

编辑 3:同步对 compile() 的调用没有帮助。也不会只向 linux 调用 sync()。但是如果可能的话,我还没有研究过 Java 级别的刷新缓冲区。

4

1 回答 1

2

什么是 javac/java 文件系统并发契约?

没有一个。如果您在线程 A 中编译线程 B 中另一个编译器所需的类,则不应该这样做。就那么简单。

于 2010-02-18T10:11:04.743 回答