对象锁定唯一值

时间:2013-10-16 19:01:12

标签: java multithreading thread-safety

嗨我有一个返回ms的同步方法。任何人都可以告诉每个对象在下面的代码中是否会获得唯一值。

public static synchronized Long generateIdforDCR() 
         {  
        int val= return System.nanoTime();
        } 

呼叫将在另一个类中,如

forloop 1... 1000
{
   ClassName cn=new ClassName();
   cn.generateIdforDCR();

}

我会永远获得独特的价值吗。

1 个答案:

答案 0 :(得分:2)

否 - 无法保证每次通话都会返回不同的值。调用(包括同步)花费的时间少于用于nanoTime()的内部时钟的粒度,这并不是不可想象的。 (的确,我可以在笔记本电脑上看到这种情况。)

听起来你应该只使用AtomicLong代替:

private static final AtomicLong counter = new AtomicLong();

public static Long generateIdforDCR() {
    return counter.incrementAndGet();
}

这将为您提供一个唯一的号码(如果您在该次运行中将其称为少于2 64 次) 。如果您需要它在更大的范围内是唯一的(例如,跨多个顺序运行,或者可能是多个并发运行的不同进程),那么您将需要稍微不同的方法。