2010-02-17 25 views
2

我正在与在单独的线程上运行,在它们之间〜10ms的暂停两个因com.sun.tools.javac.Main.compile()调用运行一个多线程构建。现在(每100个版本左右),第二个javac在第一个javac的输出中抱怨糟糕的类格式。什么是javac/java文件系统并发合同?

这是Linux,但它在所有os'es工作。我在这里面临的约束是什么?

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

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

编辑3(?):同步调用编译()没有帮助。也没有调用sync()到linux。但是如果可能的话,我还没有在java级别上查看缓冲区缓冲区。

+1

你为什么这么做?请添加更多细节 – 2010-02-17 12:50:28

+0

如果他们是单独的线程,没有同步,你怎么能期望它总是工作?这是合理的,一次在第一次线程将延迟至少10ms。我认为你需要线程之间的同步,或者它们之间有更大的延迟。 – 2010-02-17 13:47:19

+0

我添加了一个编辑;) – krosenvold 2010-02-17 13:57:21

回答

2

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

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

+0

根据#kernel的好人,linux保证了在close()时间文件的所有内容的可见性。所以如果我分开一个单独的过程,我应该是免费的家?你是否有任何提及备份“没有一个”的说法 - 我很想读更多... – krosenvold 2010-02-18 10:30:20

+0

你问了关于javac/java合约。如果你能找到一个请告诉我们。无论如何,你怎么可能知道线程A会在线程B需要它之前编译这个类? – EJP 2010-02-18 21:32:26

+0

因为我在开始线程B之前等待线程A完成。也就是说,除非A分叉更多的线程,我不知道 – krosenvold 2010-02-18 22:39:23