두 개의 종속 com.sun.tools.javac.Main.compile() 호출이 서로 다른 스레드에서 실행 중일 때 다중 스레드 빌드가 실행 중이며 그 사이에 ~ 10ms의 일시 중지가 있습니다. 매번 (100 빌드마다) 두 번째 javac은 첫 번째 javac 출력의 잘못된 클래스 형식에 대해 불평합니다.javac/java 파일 시스템 동시성 계약이란 무엇입니까?
이것은 리눅스에 있지만 모든 OS에서 작동해야합니다. 내가 직면 한 제약은 무엇인가?
동시 빌드 시스템에서 작업 중이므로 다른 모듈에 있기 때문에 javacs를 호출하는 이유가 있습니다. 실행 순서를 보장하는 외부 동기화가 있습니다 (그러나 컴파일 된() 메소드를 호출 할 때 실제로 동기화 된 블록 안에 있지는 않습니다). 그리고 나는 그들이 약 10 -20ms는 평균적으로 멈 춥니 다. 컴파일러()에 대한 두 호출이 실제로 파일 시스템 만 공유해야한다는 것을 이해할 수 있습니다.
편집 2 : 두 번째 compile() 호출을 호출하는 스레드는 첫 번째 컴파일이 완료 될 때까지 wait()에 있으므로 순서 동기화가 수행됩니다. 하지만 나는 컴파일 할 실제 호출을 호출 할 때 동기화 된 블록 안에 있지 않습니다. 컴파일은 정적 메서드이므로 해당 컨텍스트에서 내부적으로 안전한 발행물 문제가 없다고 가정합니다. (?)
편집 3 : compile() 호출을 동기화하면 도움이되지 않습니다. 또한 sync()를 리눅스로 호출하지도 않는다. 하지만 가능한 경우 자바 수준에서 버퍼 플러시를 조사하지 않았습니다.
왜 정확히 그렇게하고 있습니까? 자세한 내용을 추가하십시오 –
동기화없이 별도의 스레드 인 경우 어떻게 작동 할 것이라고 예상 할 수 있습니까? 한 번 100 번에서 첫 번째 스레드는 적어도 10ms 지연 될 것입니다. 나는 당신이 스레드 사이의 동기화, 또는 그들 사이에 더 큰 지연이 필요하다고 생각합니다. –
편집을 추가했습니다.) – krosenvold