Майте на увазі, що є деякі проблеми, які System#nanoTime()не можуть бути надійно використані на багатоядерних процесорах для запису минулого часу ... кожне ядро має власний TSC ( лічильник позначок часу ): цей лічильник використовується для отримання нано часу (насправді це кількість галочок після завантаження процесора).
Отже, якщо ОС не виконує деякої деформації часу TSC, щоб синхронізувати ядра, тоді, якщо потік стає запланованим на одному ядрі при початковому зчитуванні часу, а потім перемикається на інше ядро, відносний час може епізодично здаватися стрибком назад і вперед.
Я спостерігав це деякий час тому на AMD / Solaris, коли час, що минув між двома точками хронометражу, іноді повертався як негативні значення, так і несподівано великі позитивні числа. Були виправлення ядра Solaris та налаштування BIOS, необхідні для примусового використання AMD PowerNow! вимкнено, що вирішило це.
Крім того, існує (AFAIK) поки що невиправлена помилка при використанні Java System#nanoTime()у середовищі VirtualBox; спричиняючи всілякі химерні проблеми з переривчастими потоками для нас, оскільки велика частина java.util.concurrencyпакету покладається на нано час.
Дивіться також:
Чи System.nanoTime () абсолютно марний?
http://vbox.innotek.de/pipermail/vbox-trac/2010-January/135631.html