- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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?
请解释一下..
最佳答案
Instances of
java.util.Random
are threadsafe. However, the concurrent use of the samejava.util.Random
instance across threads may encounter contention and consequent poor performance. Consider instead usingThreadLocalRandom
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/
我是一名优秀的程序员,十分优秀!