この回答は、当時のオペレーティングシステムで実行されていた当時のSun JDKが実際に何をしたかという観点から2011年に書かれました。それはずっと前だった!leventovの答えは、より最新の視点を提供します。
その投稿は間違っており、nanoTime
安全です。この投稿には、Sunのリアルタイムおよび並行性の男であるDavid Holmesのブログ投稿にリンクするコメントがあります。それは言う:
System.nanoTime()は、QueryPerformanceCounter / QueryPerformanceFrequency APIを使用して実装されます[...] QPCによって使用されるデフォルトのメカニズムは、ハードウェアアブストラクションレイヤー(HAL)によって決定されます[...]このデフォルトは、ハードウェア全体だけでなく、OS全体でも変更されますバージョン。たとえば、Windows XP Service Pack 2は、TSCがSMPシステムの異なるプロセッサで同期されていないという問題と、その頻度が原因で、プロセッサのタイムスタンプカウンタ(TSC)ではなく電源管理タイマ(PMTimer)を使用するように変更しました。電源管理設定に基づいて変化する可能性があります(そのため、経過時間との関係も異なります)。
したがって、Windowsでは、これは WinXP SP2までは問題でしたが、現在は問題ではありません。
他のプラットフォームについて説明しているパートII(またはそれ以上)は見つかりませんが、その記事には、Linuxが同じ方法で同じ問題を検出して解決したというコメントが含まれており、clock_gettime(CLOCK_REALTIME)のFAQへのリンクがあります、それは言う:
- clock_gettime(CLOCK_REALTIME)はすべてのプロセッサ/コアで一貫していますか?(アーチは重要ですか?たとえば、ppc、arm、x86、amd64、sparc)。
それはすべきか、それがバグだらけと考えられています。
ただし、x86 / x86_64では、非同期または可変周波数TSCが時間の不整合を引き起こすことを確認できます。2.4カーネルではこれに対する保護は実際にありませんでした。また、2.6カーネルの初期はここでもあまりうまくいきませんでした。2.6.18以降では、これを検出するロジックが改善され、通常は安全なクロックソースにフォールバックします。
ppcは常に同期されたタイムベースを持っているので、それは問題になりません。
したがって、ホームズのリンクがそのnanoTime
呼び出しを暗示するものとして読み取ることができる場合clock_gettime(CLOCK_REALTIME)
、x86のカーネル2.6.18以降は常にPowerPCで安全です(Intelとは異なり、IBMとMotorolaはマイクロプロセッサの設計方法を実際に知っているため)。
悲しいことに、SPARCやSolarisについての言及はありません。そしてもちろん、IBM JVMが何をするのかはわかりません。しかし、最新のWindowsおよびLinux上のSun JVMはこれを正しく実現しています。
編集:この回答は、引用した情報源に基づいています。しかし、それでも実際には完全に間違っているのではないかと心配しています。いくつかのより最新の情報は本当に価値があります。Linuxの時計に関する4年前の新しい記事へのリンクを見つけました。