【发布时间】:2017-02-14 06:01:16
【问题描述】:
我看了几篇文章,但我还是一头雾水。
我知道并行流将以利用 CPU 的并行方式执行。而且我相信子作业将作为原子单元执行,对吗?
但是常规的 Java 8 流呢?
如果我执行让我们说下一行代码:
users.stream().map(user->user.getUsername()).collect(Collectors.toList());
该行是否也会以线程安全/原子方式执行?
【问题讨论】:
-
不,子作业不是作为原子单元执行的,但不太清楚你的意思是什么。顺序流在单个线程中执行,因此它们不必是线程安全的。
-
那么,如果我有一个多线程系统,并且我使用的是顺序流,我可能会因为竞态条件而导致数据不一致?
-
您是否有竞争条件与您所做的 Streams 处理无关。正如我所说,目前还不清楚您的想法
-
流执行读取操作。当有人同时写作并且您没有采取措施时,您会遇到问题。正如 Marko Topolnik 已经指出的那样,无论您是否使用流,情况总是如此。
-
如果
getUsername方法没有副作用,流操作不会引入任何副作用。但是,要考虑它是线程安全的,您必须确保在操作进行时 没有人 正在修改 any 线程中的源列表。你只能写一个线程安全的program,它是all操作的全部,而不是线程安全的操作。如果你的程序格式正确,流操作也可以。
标签: java multithreading concurrency java-8 java-stream