有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

唯一值的java对象锁

嗨,我有一个同步的方法,它返回ms。有人能告诉我,在下面的代码中,每个对象在哪里会得到唯一的值吗

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

调用将在另一个类中,如

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

}

我将永远得到唯一的价值


共 (1) 个答案

  1. # 1 楼答案

    否-不能保证每个调用都会返回不同的值。调用(包括同步)所花费的时间比用于nanoTime()的内部时钟的粒度要少,这不是不可想象的。(事实上,我可以在笔记本电脑上看到这种情况。)

    听起来您应该使用^{}来代替:

    private static final AtomicLong counter = new AtomicLong();
    
    public static Long generateIdforDCR() {
        return counter.incrementAndGet();
    }
    

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