更新时间:
#java7 java8 compareAndSwapLong LongAdder
我们可以窥见 JDK 8 在 x86 平台上对 compareAndSwapLong 方法做了一些操作,使用了 xadd 汇编指令代替 CAS 操作。
xadd 指令是 fetch and add。
cmpxchg 指令是 compare and swap。
xadd 指令的性能是优于 cmpxchg 指令的。
LongAdder是JDK8添加到JUC中的。 最终一致性, 高并发获取值 比 AtomLong好点, 如果不需要当时就返回正确值时 当LongAdder不存在并发访问的时候,会直接通过cas的方式更新base的值,存在并发访问时,会定位到某一个cell,修改cell的value。
最终,value = base + sum(cells)。
当需要在高并发下有较好的性能表现,且对值的精确度要求不高时,可以使用LongAdder(例如网站访问人数计数)。 当需要保证线程安全,可允许一些性能损耗,要求高精度时,可以使用AtomicLong。 直播间在线人数这种功能,通常使用概数即可。