嗨,我有一个返回 ms 的同步方法。谁能告诉下面的代码中每个对象是否会在哪里获得唯一值。
public static synchronized Long generateIdforDCR()
{
int val= return System.nanoTime();
}
调用将在另一个类中进行,例如
forloop 1... 1000
{
ClassName cn=new ClassName();
cn.generateIdforDCR();
}
我总是能获得独特的值(value)吗?
最佳答案
否 - 不能保证每次调用都会返回不同的值。调用(包括同步)所花费的时间比用于 nanoTime()
的内部时钟的粒度要少,这并非不可想象。 (事实上,我可以在我的笔记本电脑上看到这种情况发生。)
听起来你应该只使用 AtomicLong
相反:
private static final AtomicLong counter = new AtomicLong();
public static Long generateIdforDCR() {
return counter.incrementAndGet();
}
这将为您提供一个唯一的编号(如果您在该运行中调用次数少于 264 次)。如果您需要它在更大的范围内保持唯一(例如,跨多个顺序运行,或者可能是不同进程的多个并发运行),那么您将需要稍微不同的方法。
关于java - 唯一值的对象锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411594/