我有一个对AtomicLong变量进行高并发写入的用例。我只需要在该变量中设置当前epoc时间。最快的方法是什么?LongAccumulator.accumulate是AtomicLong.set的更好的替代品吗?如果我只想将变量设置为某个值而不进行任何加法或计算,是否有任何统计数据可以告诉我每秒有多少并发请求?
LongAccumulator.accumulate
AtomicLong.set
e4eetjau1#
原始volatile和atomic long在简单集合中执行相同的操作,因为atomic long在内部使用volatile long字段。在同一个volatile上每秒进行几百万次并发更新对典型应用来说不存在性能问题。此外,如果您根本不知道某个问题是否是性能问题,我会小心地优化代码。
3lxsmp7m2#
简单地说,共享long之间threads安全只需neet volatile关键字,如:
long
threads
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的性能更好,因为代码更少:)
AtomicLong
2条答案
按热度按时间e4eetjau1#
原始volatile和atomic long在简单集合中执行相同的操作,因为atomic long在内部使用volatile long字段。在同一个volatile上每秒进行几百万次并发更新对典型应用来说不存在性能问题。
此外,如果您根本不知道某个问题是否是性能问题,我会小心地优化代码。
3lxsmp7m2#
简单地说,共享
long
之间threads
安全只需neetvolatile
关键字,如:所以,如果你只是这样使用它,它就足够了。
但对于你的问题如果你检查源代码
原子长源:
长累加器源:
因此,
AtomicLong
的性能更好,因为代码更少:)