Java LongAdder
比AtomicLong
更高效。但是,如果我正确地得到它,它不是ID生成器的好选择,因为没有原子“读取和增量”操作。
我问这个是因为我看到人们推荐它用于ID生成,我没有看到这一点,因为每个操作都会调用sum()
。
LongAdder
是简单长ID生成器的好或坏选择吗?
答案 0 :(得分:7)
我想你已经回答了自己的问题。从单线程生成id肯定是过度的,并且在多线程场景中不可用,因为没有类似操作的原子incrementAndGet
。所以答案必须是它不是一个好的选择。
正如javadoc所说,这个类对于收集统计数据以及争用可能性很高的事情非常有用:
此类通常优于
AtomicLong
时 多个线程更新用于此目的的公共和 收集统计信息,而不是细粒度同步 控制。
答案 1 :(得分:6)
首先, Java的LongAdder更高性能,然后AtomicLong 非常正确。如果存在高争用,则会出现这种情况 - 否则它与内部的AtomicLong
相同。但即便如此 - 你应该知道它使用了一些额外的空间,以便每个Thread分别计算结果,所以当调用sum
时它只收集那些结果。
但无论如何,ID
生成器绝对不是一个好选择。