2010-02-17 40 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

相關問題