LongAdder是ID生成器的错误选择吗?

igr*_*igr 8 java java-8

Java的LongAdder性能更高AtomicLong.但是,如果我正确地得到它,它对于ID生成器来说不是一个好的选择,因为没有原子"读取和增量"操作.

我问这个是因为我看到人们推荐它用于ID生成,我没有看到这一点,因为sum()每次操作都会调用它.

LongAdder对于简单的长ID生成器来说,这是一个好的还是坏的选择?

hgr*_*rey 7

我想你已经回答了自己的问题.对于单线程的id生成来说肯定是矫枉过正的,并且在多线程场景中不可用,因为没有incrementAndGet类似原子的操作.所以答案必须是它不是一个好的选择.

正如javadoc所说,这个类对于收集统计信息以及争用可能很高的事情很有用:

AtomicLong当多个线程更新用于收集统计信息但不用于细粒度同步控制的目的的公共和时,此类通常更为可取.

  • ......或者当你知道将来有一点你可以在没有争用的情况下阅读最终结果.肯定不是ID生成器的情况. (2认同)

Eug*_*ene 6

首先是Java的LongAdder更高性能,然后AtomicLong也不是很正确.如果存在高争用的话就是这种情况 - 否则就像AtomicLong内部一样.但即便如此 - 你应该知道它使用了一些额外的空间,以便每个Thread分别计算结果,所以当sum调用它时只收集那些结果.

ID无论哪种方式,绝对不是发电机的好选择.