java 设置与长累积器的累积性能

8oomwypt  于 2023-02-28  发布在  Java
关注(0)|答案(2)|浏览(139)

我有一个对AtomicLong变量进行高并发写入的用例。我只需要在该变量中设置当前epoc时间。最快的方法是什么?
LongAccumulator.accumulateAtomicLong.set的更好的替代品吗?如果我只想将变量设置为某个值而不进行任何加法或计算,是否有任何统计数据可以告诉我每秒有多少并发请求?

e4eetjau

e4eetjau1#

原始volatile和atomic long在简单集合中执行相同的操作,因为atomic long在内部使用volatile long字段。在同一个volatile上每秒进行几百万次并发更新对典型应用来说不存在性能问题。
此外,如果您根本不知道某个问题是否是性能问题,我会小心地优化代码。

3lxsmp7m

3lxsmp7m2#

简单地说,共享long之间threads安全只需neet volatile关键字,如:

private volatile long value;

所以,如果你只是这样使用它,它就足够了。
但对于你的问题如果你检查源代码

原子长源:

public final void set(long newValue) {
    value = newValue;
}

长累加器源:

public void accumulate(long x) {
    Cell[] as; long b, v, r; int m; Cell a;
    if ((as = cells) != null ||
        (r = function.applyAsLong(b = base, x)) != b && !casBase(b, r)) {
        boolean uncontended = true;
        if (as == null || (m = as.length - 1) < 0 ||
            (a = as[getProbe() & m]) == null ||
            !(uncontended =
              (r = function.applyAsLong(v = a.value, x)) == v ||
              a.cas(v, r)))
            longAccumulate(x, function, uncontended);
    }
}

final void longAccumulate(long x, LongBinaryOperator fn,
                          boolean wasUncontended) {
    //.... a lot of codes
}

因此,AtomicLong的性能更好,因为代码更少:)

相关问题