是否有一个Java API /建议使用而不是System.currentTimeMillis()来获取Windows上毫秒秒精度的当前时间 - 要求是两个后续调用,睡眠时间为1毫秒,应该给出两个不同的时间 - 当前我需要明确睡眠15毫秒才能获得不同的时间
答案 0 :(得分:6)
请勿尝试使用时间来创建唯一值。使用数据库为记录生成唯一ID(我假设的键)。使用自动递增字段或创建一个单独的表,其中包含一个记录,可以锁定并安全更新计数器。
虽然你可能会得到一个有效的解决方案,但依靠时间来防止资源冲突最终会赶上你。
答案 1 :(得分:5)
从Java 1.5开始,您可以将System.nanoTime()
用于更高精度的微基准测试。由于基于可能改变的固定时间(参见方法的Javadoc),将它与System.currentTimeMillis()
组合可能是有意义的,例如
String time = System.currentTimeMillis() + "" + System.nanoTime();
答案 2 :(得分:3)
这是一个窗口限制。如果在其他操作系统上调用System.currentTimeMillis(),则可以获得更高的精度。
我的建议是不要使用时间戳作为唯一性的来源。使用为此问题设计的oracle序列。否则使用线程名称+ timetamp(yuk)。
或者你可以使用System.nanoTime(),但它只对时差有用,而不是绝对时间。
答案 3 :(得分:3)
从java 1.5开始,您可以使用java.util.UUID生成唯一ID。
e.g
public static void main(String[] args)
{
System.out.println("uuid=" + UUID.randomUUID().toString());
System.out.println("uuid=" + UUID.randomUUID().toString());
}
答案 4 :(得分:2)
currentTimeMillis()调用的分辨率取决于底层操作系统,不应依赖于在您的情况下创建唯一标记。考虑使用一个UID单例,它可以为你提供一个long值,每次调用都会增加1,然后使用它。
答案 5 :(得分:1)
为什么你需要时间独特?
在交易开始时花时间,然后为每个插入添加一个MS。
答案 6 :(得分:1)
在这里区分准确性和精确度非常重要。 System.currentTimeMillis()
具有毫秒精度,但无法保证准确性,因为它从底层操作系统获得,操作系统从硬件获取,并且不同的硬件时钟具有不同的精度。
使用它进行数据版本控制是一个坏主意,因为即使你有精确到毫秒的时间,如果在同一毫秒内发生了两件事,你仍然会冒着偶然发生冲突的风险。
答案 7 :(得分:0)
虽然这与问题没有直接关系,但我不赞成最初尝试生成某些版本标识符的评论。
这当然是一个坏主意,正如其他海报所详述的那样。
如果您无法使用数据库,那么更好的想法是使用AtomicInteger
或AtomicLong
- 然后您可以调用getAndIncrement()
或incrementAndGet()
不担心可能出现的任何时间问题。
答案 8 :(得分:0)
绝对时间分辨率的15ms限制是您的操作系统和功能的一个特点。中断率。我知道对Linux来说有一个内核补丁可以将分辨率提高到1ms(甚至可能是微秒?),但不确定Windows。正如其他人所评论的那样,相对时间可以使用System#nanoTime()来解决(目前用于微秒精度)。无论哪种方式,您都应该考虑使用db密钥(或类似的)来分配唯一密钥。
链接