System.nanoTimeの()はなぜデータベースの主キーとして使用することはできません

1 System.nanoTimeの()が定義されています

System.nanoTime()戻り値のみと进程已运行的时间有关不受调系统时间影响

コメントはナノ秒の方法によれば:

ナノ秒単位で返します実行しているJava仮想マシンの高分解能タイムソースの現在の値を、。
この方法は、経過時間を測定するために使用することができ、システム又は壁時計時間の任意の他の概念に関連していません。(値は負であってもよいので、おそらく将来的に)戻り値は、いくつかの固定されたが、任意の起源の時間のでナノ秒を表します。同じ起源は、Java仮想マシンのインスタンスでは、この方法のすべての呼び出しで使用されます。他の仮想マシンインスタンスは、異なる起源を使用する可能性があります。

翻訳:電流を返しますJVM的高精度时间この方法にのみ使用することができます测量时段し、と系统时间无关これは、特定の戻り値である固定但随意時点で(将来的にはおそらくいくつかの時間)を開始します。異なるJVM用途の出発点が異なっていてもよいです。

これは少し怖いが、結果が異なる可能性があり、我々は異なるマシン上で実行する同じコードです。したがって、それはほとんど、計算するために使用されていない通常測定先后顺序时间段、テスト前netty(時間ラウンドツールクラスHasedTimeWheel)がサポートされていないことを見出し调系统时间、このようなタスクは6:00行われ、ホイール時に提出した後、時間がシステムを7に調整しました。ポイントタスクはすぐに実行されていませんが、見てHasedTimeWheel、このような見つけるために、試験食の後、サポート転送時間に設計された感じというコードは(すなわち、タスクが午前7時直後に実行されなければならない転送)System.nanoTime()として当前时间転送時間をサポートするために、 、ちょうどする必要がありますSystem.nanoTime()置き換えるSystem.currentTimeMillis()(関連する時間単位を変更しなければならない)。
System.currentTimeMillis()から戻り1970、今まで数ミリ秒

2つの比較期間

System.nanoTime()戻り値は、呼び出しを決定するために0を使用する減算オーダーよりも大きいが、使用することができないかどう>か、<判断する。
System.nanoTime()実際の値は、64ビット符号なし数である返し随着进程运行时间增长, 溢出后再从0开始相補ように対応するロングコードのタイプに割り当てられ、(符号付き数)使用した値の周期的な性質を次のように:

最小负数 -> 0 -> 最大正数 -> 最小负数 -> ...

仮定が2つの未知の呼び出しシーケンスであり、時間間隔は、以下の二つの呼び出しである2^63ns(+約200年)

	long t1 = System.nanoTime();
	long t2 = System.nanoTime();

場合t1及びt2正またはでありt1且つt2負であり、t1そしてt2差を超えない2^63、それらはないオーバーフローし減算、t1>t2 <=> t1-t2>0および多数減算比較することによって、最初の呼び出しの後に戻り、そうしなければならない><比較演算子を;ができ
t1とt2、正と負、t2が設け正数である場合に比較値が符号なしの数であるように、呼が返された後に、T1がT2> T1とT2が最初後導出されるように、負知ることができるされていますコールがエラーである。加えて、我々は、2つのコールを想定すると、2未満のスペーサーである63はt2-t1一定の値が2よりも大きい63である(にlong負である)、それはt2-t1<0この時点ではまだ正しい減算することによって決定されます。

综上所述,System.nanoTime()是不适合作为数据库主键

公開された334元の記事 ウォンの賞賛186 ビュー310 000 +

おすすめ

転載: blog.csdn.net/u012060033/article/details/103374912