gpt4 book ai didi

java - 使用atomic来生成唯一的id

转载 作者:行者123 更新时间:2023-12-02 00:01:34 24 4
gpt4 key购买 nike

class ABC{
private static Random random = new Random();
private static AtomicLong uniqueLongId = new AtomicLong(System.currentTimeMillis());

public static long getUniqueLongId(){

long id = uniqueLongId.incrementAndGet();
long uniqueID = Math.abs(random.nextLong()) + id;
return uniqueID;

//the above code we can write in one line
//return Math.abs(random.nextLong())+uniqueLongId.incrementAndGet();

}
}

上面的方法 getUniqueLongId() 会在多线程环境中为我提供唯一的 id 吗?我在这里关心的是:知道 uniqueLongId 是原子的,并假设调用incrementAndGet() 将是线程安全的调用,但代码的其他部分不同步。这是否意味着 getUniqueLongId() 方法本身不是线程安全的?因此可能不一定返回唯一的 id?

请解释一下..

最佳答案

Java 7 docs写:

Instances of java.util.Random are threadsafe. However, the concurrent use of the same java.util.Random instance across threads may encounter contention and consequent poor performance. Consider instead using ThreadLocalRandom in multithreaded designs.

因此,您的代码在 Java 7 中是线程安全的。每个操作要么是对线程安全方法的调用,要么仅对局部变量进行操作。并且您不需要原子性,即您不需要下一个序列号与下一个随机数配对。

由于(根据您的评论)旧版本的 API 文档中没有此类保证,理论上实现可能是非线程安全的。然而,看看src.zip在 Sun JDK 1.4.2.19(这是我拥有的最旧的版本)中,该代码已经使用了原子变量,从而在实践中提供了线程安全的行为。

也就是说,您的代码还有许多其他问题。就像上面引用的那样,性能可能很差。如assylias already wrote in a comment ,这种方法不会为您提供比简单的 Random 更多的唯一数字。会。此外, Math.abs(Long.MIN_VALUE) 仍然是负数,正随机数加上 id 可能会导致溢出和环绕。因此,如果您需要正数,则必须更加小心。 final uniqueID &= 0x7fffffffffffffffL可能比Math.abs更合适一路走来。

关于java - 使用atomic来生成唯一的id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14729305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com