java流中的原子长
我不能减少流中的公共Long值(流中使用的外部声明值必须是final),因此我必须在java流中使用java流中的原子长,java,java-stream,java-9,Java,Java Stream,Java 9,我不能减少流中的公共Long值(流中使用的外部声明值必须是final),因此我必须在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
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();
});
var users=Stream getUsers();
var dec=新原子长(10);
长dec=10;
//用户是一个
用户。forEach(u->{
//不能在流中工作,因此我必须使用AtomicLong
十二月--;
//这很有效
dec.decrementAndGet();
//如果我只想得到原始值,我应该使用哪一个?
长实际值=十二月getPlain();
long actualValue=dec.get();//与dec.getOpaque()相同;
});
我看不出dec.getPlain()
和dec.get()
之间有什么区别。我不明白这是怎么回事
阅读的记忆语义
在API中描述。这些方法的区别在哪里
如果我只有一个线程读取
实际值
那么应该使用哪个线程?区别在于从内存中获取结果的方法。即。如果将其读取为声明为易失性
或正常变量volatile
用于由多个线程同时访问的变量。当一个线程更改普通变量时,其他线程可能永远看不到更改,因为每个线程都可能在自己的缓存中保存该变量<代码>易失性变量必须始终从公共内存(而不是缓存)读取和写入。这使得并发使用时的访问速度较慢但可靠
如果不同时使用该值,则方法
getPlain()
就足够了,而且应该更快。但是对流的副作用使用AtomicLong
是一种误用,因为当以功能方式编程时,不应该依赖副作用。当您尝试以功能方式编程时,不应该使用副作用。您不应该使用任何副作用。在流操作中滥用AtomicLong
进行有状态操作是一种反模式。您对内存模式的混淆是一个很好的指示器,表明您正在使用一个工具来完成它不该做的事情。请使用一个普通的for
循环。或者干脆long dec=10-users.size()代码>后者说明了“需要减少一个值”是如何产生的。你永远不需要减少一个值。某些后续代码可能需要结果值。减少每个元素的计数器只是一种可能的方法。不一定是最好的。另一个是流上的count()
方法。for(迭代器it=users.Iterator();it.hasNext();){User u=i.next();/*循环体的其余部分*/}
不将流收集到列表中。也许有其他方法可以替代这个循环。但是找到它们需要了解操作的实际目的。@GhostCatusers
是一个用户流(streamusers;
)。