java 个流中的 atomicLong
atomicLong within java streams
我不能递减流中的公共长值(流中使用的外部声明值必须是最终值),所以我必须在 java 流中使用 AtomicLong
:
var users = Stream<User> getUsers();
var dec = new AtomicLong(10);
long dec = 10;
// users is a
users.forEach(u->{
// does not work within streams, so I have to use AtomicLong
dec--;
// this works
dec.decrementAndGet();
// which one should I use, if I only want to get the raw value?
long actualValue = dec.getPlain();
long actualValue = dec.get(); // the same as dec.getOpaque();
});
我看不出 dec.getPlain()
和 dec.get()
之间有任何区别。我不明白
with memory semantics of reading
描述在API。这些方法的区别在哪里?
如果我只有一个读取 actualValue
.
的线程,我应该使用哪个
区别在于从内存中获取结果的方法。 IE。如果它被读取为好像声明为 volatile
或作为普通变量。 volatile
用于被多个线程同时访问的变量。当一个线程正在更改普通变量时,其他线程可能永远看不到更改,因为每个线程都可能将变量保存在自己的缓存中。 volatile
变量必须始终从公共内存(而非缓存)读取和写入。这使得同时使用时访问速度较慢但可靠。
不并发使用值时,getPlain()
的方法就足够了,应该会更快。但是使用 AtomicLong
作为流的副作用是一种误用,因为在以函数式方式编程时,你不应该依赖于副作用。
我不能递减流中的公共长值(流中使用的外部声明值必须是最终值),所以我必须在 java 流中使用 AtomicLong
:
var users = Stream<User> getUsers();
var dec = new AtomicLong(10);
long dec = 10;
// users is a
users.forEach(u->{
// does not work within streams, so I have to use AtomicLong
dec--;
// this works
dec.decrementAndGet();
// which one should I use, if I only want to get the raw value?
long actualValue = dec.getPlain();
long actualValue = dec.get(); // the same as dec.getOpaque();
});
我看不出 dec.getPlain()
和 dec.get()
之间有任何区别。我不明白
with memory semantics of reading
描述在API。这些方法的区别在哪里?
如果我只有一个读取 actualValue
.
区别在于从内存中获取结果的方法。 IE。如果它被读取为好像声明为 volatile
或作为普通变量。 volatile
用于被多个线程同时访问的变量。当一个线程正在更改普通变量时,其他线程可能永远看不到更改,因为每个线程都可能将变量保存在自己的缓存中。 volatile
变量必须始终从公共内存(而非缓存)读取和写入。这使得同时使用时访问速度较慢但可靠。
不并发使用值时,getPlain()
的方法就足够了,应该会更快。但是使用 AtomicLong
作为流的副作用是一种误用,因为在以函数式方式编程时,你不应该依赖于副作用。