我正在运行一个多线程构建,其中两个依赖的com.sun.tools.javac.Main.compile()调用在不同的线程上运行,它们之间暂停约10毫秒。每隔一段时间(每100个版本左右),第二个javac会抱怨第一个javac输出中的错误类格式。
这是在linux上,但它必须适用于所有操作系统。我面临的限制是什么?
我正在开发并发构建系统,所以我调用javacs的原因是因为它们位于不同的模块中。有外部同步可以确保运行顺序(但是当我调用compile()方法时,我实际上并不在同步块中),并且我确信它们是一个接一个地被调用的,大约10个-20毫秒平均停顿。总而言之,我可以理解这两个对compile()的调用应该只是共享文件系统吗?
编辑2: 调用第二个compile()调用的线程在wait()中,直到第一个调用完成,因此存在顺序同步。但是当我调用实际的编译调用时,我不在同步块中。编译是一种静态方法,我假设它们在该上下文中没有任何内部安全发布问题......(?)
编辑3:将调用同步到compile()没有帮助。也不是只调用sync()到linux。但是如果可能的话,我还没有在java级别上查看刷新缓冲区。
答案 0 :(得分:2)
什么是javac / java文件系统 并发合同?
没有一个。如果您正在编译线程A中另一个编译器所需的线程A中的类,那么您不应该这样做。就这么简单。