Należy pamiętać, że istnieją pewne problemy, w przypadku System#nanoTime()których nie można niezawodnie używać na wielordzeniowych procesorach do rejestrowania czasu, który upłynął ... każdy rdzeń ma własny TSC ( licznik znaczników czasu ): ten licznik jest używany do uzyskania czasu nano (tak naprawdę jest liczba taktów od momentu uruchomienia procesora).
W związku z tym, jeśli system operacyjny nie wykona pewnego dopasowania czasu TSC, aby utrzymać synchronizację rdzeni, to jeśli wątek zostanie zaplanowany na jednym rdzeniu, gdy zostanie odczytany początkowy czas, a następnie zostanie przełączony na inny rdzeń, względny czas może sporadycznie wydawać się przeskoczyć wstecz i naprzód.
Zauważyłem to jakiś czas temu na AMD / Solaris, gdzie czasy, które upłynęły między dwoma punktami czasowymi, czasami wracały jako wartości ujemne lub nieoczekiwanie duże liczby dodatnie. Była łatka na jądro Solaris i ustawienie BIOS wymagane do wymuszenia AMD PowerNow! off, który wydawał się go rozwiązać.
Ponadto istnieje (AFAIK) jak dotąd nie naprawiony błąd podczas korzystania z języka Java System#nanoTime()w środowisku VirtualBox; powodując dla nas różnego rodzaju dziwne, sporadyczne problemy z gwintowaniem, ponieważ większość java.util.concurrencypakietu opiera się na nano-czasie.
Zobacz też:
Czy System.nanoTime () jest całkowicie bezużyteczny?
http://vbox.innotek.de/pipermail/vbox-trac/2010-J January/135631.html