Java 中的隐式和显式并行

jjh*_*son 6 java parallel-processing concurrency multithreading

一直在研究 Java 语言中的隐式和显式并发,经过大量研究后想澄清一些事情。

  • Java 语言中的隐式并行性是否仅通过使用 Java 8 流来实现?
  • 我是否认为 Java 中的显式并行性是通过使用程序员编写的线程来实现的。(区别在于隐式并行应该通过编译器而不是程序员编写的代码发生)?

谢谢

Dav*_*aro 3

隐式并行性是指编译器在没有程序员“任何”提示的情况下并行执行某些操作的能力。如果您要执行的计算具有某些属性(例如并行作业之间没有数据依赖性),则这是可以实现的。

Java流是(引用Oracle的文档)支持顺序和并行聚合操作的元素序列,并且与集合有根本的不同,因为

1)集合被设计为快速访问和操作集合的元素

2) Stream并不是用来修改的,而是用来在源元素和结果元素之间创建一种管道。结果元素是通过对源应用操作(通常以函数/lambda 样式描述)来创建的。这种计算可以安全地划分为子管道并以并行方式处理。

组成该管道的函数必须具有以下属性: 1)必须是非干扰的(它们不修改流源);2)无状态(它们的结果不应该依赖于流管道执行期间可能改变的任何状态)。看这里

显式并行性(顾名思义)是由程序员实现的,程序员可以根据需要生成尽可能多的(计算元素)。这些元素通常是线程或进程(请参阅此处了解差异) 那些计算元素同时执行,并且取决于程序员协调所有操作以产生正确的结果(例如显式同步线程、交换消息、进行事务操作等)。