Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java流中的原子长_Java_Java Stream_Java 9 - Fatal编程技术网

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

我不能减少流中的公共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
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();/*循环体的其余部分*/}
不将流收集到
列表中。也许有其他方法可以替代这个循环。但是找到它们需要了解操作的实际目的。@GhostCat
users
是一个用户流(
streamusers;
)。