2010-02-17 4 views
2

두 개의 종속 com.sun.tools.javac.Main.compile() 호출이 서로 다른 스레드에서 실행 중일 때 다중 스레드 빌드가 실행 중이며 그 사이에 ~ 10ms의 일시 중지가 있습니다. 매번 (100 빌드마다) 두 번째 javac은 첫 번째 javac 출력의 잘못된 클래스 형식에 대해 불평합니다.javac/java 파일 시스템 동시성 계약이란 무엇입니까?

이것은 리눅스에 있지만 모든 OS에서 작동해야합니다. 내가 직면 한 제약은 무엇인가?

동시 빌드 시스템에서 작업 중이므로 다른 모듈에 있기 때문에 javacs를 호출하는 이유가 있습니다. 실행 순서를 보장하는 외부 동기화가 있습니다 (그러나 컴파일 된() 메소드를 호출 할 때 실제로 동기화 된 블록 안에 있지는 않습니다). 그리고 나는 그들이 약 10 -20ms는 평균적으로 멈 춥니 다. 컴파일러()에 대한 두 호출이 실제로 파일 시스템 만 공유해야한다는 것을 이해할 수 있습니다.

편집 2 : 두 번째 compile() 호출을 호출하는 스레드는 첫 번째 컴파일이 완료 될 때까지 wait()에 있으므로 순서 동기화가 수행됩니다. 하지만 나는 컴파일 할 실제 호출을 호출 할 때 동기화 된 블록 안에 있지 않습니다. 컴파일은 정적 메서드이므로 해당 컨텍스트에서 내부적으로 안전한 발행물 문제가 없다고 가정합니다. (?)

편집 3 : compile() 호출을 동기화하면 도움이되지 않습니다. 또한 sync()를 리눅스로 호출하지도 않는다. 하지만 가능한 경우 자바 수준에서 버퍼 플러시를 조사하지 않았습니다.

+1

왜 정확히 그렇게하고 있습니까? 자세한 내용을 추가하십시오 –

+0

동기화없이 별도의 스레드 인 경우 어떻게 작동 할 것이라고 예상 할 수 있습니까? 한 번 100 번에서 첫 번째 스레드는 적어도 10ms 지연 될 것입니다. 나는 당신이 스레드 사이의 동기화, 또는 그들 사이에 더 큰 지연이 필요하다고 생각합니다. –

+0

편집을 추가했습니다.) – krosenvold

답변

2

javac/java 파일 시스템 동시성 계약이란 무엇입니까?

하나도 존재하지 않습니다. 스레드 A에서 스레드 B의 다른 컴파일러가 필요로하는 클래스를 컴파일하는 경우에는 그러지 않아야합니다. 그처럼 간단합니다.

+0

#kernel의 좋은 사람들에 따르면, linux는 close() 시간에 파일의 모든 내용에 대한 가시성을 보장한다. 그래서 별도의 과정을 거쳐야한다면 나는 집에서 자유롭게해야만합니까? "하나도 없다"라는 말을 뒷받침 할만한 언급이 있습니까? 더 궁금합니다. – krosenvold

+0

javac/java 계약에 대해 질문했습니다. 하나를 찾을 수 있으면 알려주십시오. 어쨌든 스레드 B가 스레드를 필요로하기 전에 스레드 A가 클래스를 컴파일한다는 것을 어떻게 알 수 있습니까? – EJP

+0

내가 스레드 B를 시작하기 전에 스레드 A가 끝나기를 기다리기 때문에. A가 더 많은 스레드를 포크하지 않는 한, 내가 모르는 스레드 – krosenvold