x86 시스템 에서 블로그 게시물 Java의 System.nanoTime ()주의 x86 시스템 에서 설명하는 것처럼 Java의 System.nanoTime ()은 CPU 특정 카운터를 사용하여 시간 값을 반환합니다 . 이제 통화 시간을 측정하는 데 사용하는 다음 사례를 고려하십시오.
long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;
이제 멀티 코어 시스템에서 time1을 측정 한 후 스레드가 이전 CPU의 카운터보다 작은 다른 프로세서로 스레드가 예약 될 수 있습니다. 따라서 time1보다 작은 time2의 값을 얻을 수 있습니다. 따라서 timeSpent에서 음수 값을 얻습니다.
이 경우를 고려할 때 System.nanotime이 지금은 쓸모가 없습니까?
시스템 시간을 변경해도 나노 시간에는 영향을 미치지 않습니다. 그것은 위에서 설명한 문제가 아닙니다. 문제는 각 CPU가 켜진 이후 다른 카운터를 유지한다는 것입니다. 이 카운터는 첫 번째 CPU에 비해 두 번째 CPU에서 더 낮을 수 있습니다. 스레드가 time1을 얻은 후 OS에 의해 두 번째 CPU로 스케줄 될 수 있으므로 timeSpent 값이 올바르지 않고 음수 일 수도 있습니다.