Java中的并发性和并行性之间有区别吗?

我一直在Google中做一些研究,并且无法完全了解Java中并发和并行程序之间的差异(如果有的话)。我看过的一些信息表明两者之间没有区别。是这样吗??


答案 1

这取决于谁在定义它。创建Go编程语言的人如果将代码 Concurrent 分解为可以并行处理的片段,则调用 Concurrent 代码,而 Parallelism 意味着这些片段实际上是同时运行的。

由于这些是编程原则,因此编程语言与如何定义它们无关。但是,Java 8将具有更多功能,可以同时实现并发性和并行性,而不会过多地弄乱代码。例如,像这样的代码:

List<Integer> coolItemIds = new List<Integer>();
for(Item item : getItems())
{
    if(item.isCool())
    {
        int itemId = item.getId();
        coolItemIds.add(item);
    }
}

...这是非并发和非并行的,可以这样写(我的语法可能是错误的,但希望你明白这个想法):

Iterable<Item> items = getItems();
Iterable<Item> coolItems = items.filter(item -> item.isCool());
Iterable<Integer> coolItemIds = coolItems.map(item -> item.getId());

上面的代码是以并发方式编写的:给定的代码都不需要一次过滤一个 coolItems,或者一次只能调用一个项目,甚至不需要在列表开头的项目之前过滤或映射列表开头的项目。根据从 返回的类型,给定的操作可能会或可能不会并行运行,但您编写的代码是并发的。getId()IterablegetItems()

还感兴趣:


答案 2

我想这取决于你的定义,但我的理解大致是这样的:

  • 并发性是指以某种未指定的顺序发生的事情。多任务处理 - 通过时间切片交错指令来执行多个程序 - 是考虑这种并发感的好方法。
  • 并行性(或“真正的”并行性)是指在字面上同时发生的事情。这需要硬件支持(协处理器、多核处理器、联网机器等)。所有并行性都是并发的,但并非所有并发性都是并行的。

据我所知,这两个术语都不是特定于Java的,或者具有任何特定于Java的细微差别。


推荐