java - 唯一值的对象锁定

标签 java multithreading thread-safety

嗨,我有一个返回 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/

相关文章:

multithreading - 关于后台线程更新 NSView 的通知

ios - 相同的操作在两个相同的项目中执行时间不同

java - 在简单的聊天程序中,服务器发送字符串的数组列表,但客户端接收旧值

c - C 中的线程安全

c# - .NET 线程 - 同步对象

java - 为什么 PreparedStatement.setNull 需要 sqlType?

java - 两种不同的参数类型(将对象转换为类型)

java - ReentrantLock and Condition,最佳设计

java - readObject() 挂起程序

java - Excel 到文本的转换正确处理公式和空单元格