System.nanoTime () ¿Por qué no puede servir como clave principal de base de datos

1 System.nanoTime () se define

System.nanoTime()El valor de retorno solamente y 进程已运行的时间有关, 不受调系统时间影响.

De acuerdo con el método de nanosegundos comentarios:

Devuelve el valor actual de la fuente de tiempo de alta resolución del Java que se ejecuta de máquina virtual, en nanosegundos.
Este método sólo se puede utilizar para medir el tiempo transcurrido y no se relaciona con cualquier otra noción de sistema o de pared reloj de tiempo. El valor devuelto representa nanosegundos desde algún tiempo origen fijo pero arbitraria (quizás en el futuro, por lo que los valores pueden ser negativos). El mismo origen es utilizado por todas las invocaciones de este método en una instancia de una máquina virtual Java; otras instancias de máquinas virtuales son propensos a utilizar un origen diferente.

Traducido: Devuelve el actual JVM的高精度时间. Este método sólo se puede utilizar 测量时段y y 系统时间无关. Es el valor de retorno de un cierto 固定但随意punto en el tiempo comienza (probablemente algún momento en el futuro). A diferente JVMpunto de partida de uso puede ser diferente.

Esto es un poco de miedo es el mismo código se corre en máquinas diferentes pueden causar que los resultados difieran. Por lo tanto, rara vez se utiliza para calcular, por lo general se mide 先后顺序y 时间段, antes de la prueba nettyclase de herramienta redonda de tiempo ( HasedTimeWheel) encontró que no es compatible 调系统时间, tal tarea se realiza 06:00, después de la presentación a la hora de la rueda, cuando el sistema se ajustó a 7 tareas punto no se realiza inmediatamente, pero mirada en HasedTimeWheelel código que sentirse diseñado para el tiempo de transferencia de apoyo (es decir, transfiere la tarea debe realizarse inmediatamente después de las 7:00), después de la comida de prueba para descubrir tales System.nanoTime()como 当前时间, con el fin de apoyar el tiempo de transferencia , sólo hay que System.nanoTime()sustituir System.currentTimeMillis()(las unidades de tiempo relevantes tienen que ser cambiado).
System.currentTimeMillis()retornos de 1970unos pocos milisegundos a la ahora

2 períodos de tiempo Comparar

System.nanoTime()Si el valor de retorno es mayor que el orden resta para utilizar 0 para determinar la llamada, pero no puede ser utilizado >o <ser juzgado.
System.nanoTime()Devuelve los valores reales son de 64 bits número sin signo 随着进程运行时间增长, 溢出后再从0开始, asignados al tipo de código largo correspondiente a como complemento (número con signo ) que se utiliza el valor de naturaleza cíclica de la siguiente manera.:

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

Supongamos que hay dos secuencia de llamada desconocida, y el intervalo de tiempo es menos de dos llamadas 2^63ns(alrededor de 200 + año)

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

Si t1y t2son positivos o t1y t2son negativos, t1y t2la diferencia no supera 2^63, restarlos no se desborde, t1>t2 <=> t1-t2>0y un gran número debe ser devuelto después de la primera llamada, y mediante la comparación de las restas ><Los operadores de comparación puede;
si t1 y t2, una positiva y negativa, t2 es un número positivo proporcionado, como valores comparativos son números sin signo, t1 es negativo puede ser conocido después se devuelve una llamada, de modo que el t2> t1 y t2 se deriva después de la primera llamada es un error. Además, suponemos las dos llamadas es inferior a 2 espaciador 63 es , t2-t1el valor de la constante es mayor que 2 63 es (en longque es negativo), se t2-t1<0, en este momento se determina restando siendo correcta.

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

Publicados 334 artículos originales · ganado elogios 186 · vistas 310 000 +

Supongo que te gusta

Origin blog.csdn.net/u012060033/article/details/103374912
Recomendado
Clasificación