java中的并发性和并行性有区别吗?

时间:2013-01-02 22:29:14

标签: java multithreading concurrency parallel-processing

我一直在谷歌做一些研究,并且无法理解java中并发和并行程序之间的差异(如果有的话)。我所看到的一些信息表明两者之间没有差异。是这样的吗?

8 个答案:

答案 0 :(得分:23)

这取决于谁来定义它。创建Go编程语言call code 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());

以上代码以并发方式编写:给定代码中没有一个要求一次过滤一个coolItem,或者只能在一个项目上调用getId()一次,甚至在列表开头的项目需要在项目结束之前进行过滤或映射。根据{{​​1}}返回的Iterable类型,给定的操作可能会也可能不会并行运行 ,但您编写的代码是 concurrent < / em>的

也感兴趣:

答案 1 :(得分:16)

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

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

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

答案 2 :(得分:5)

并行化(或并行计算或并行计算)是一种计算形式,其中许多计算同时进行。实质上,如果CPU密集型问题可以划分为较小的独立任务,那么这些任务可以分配给不同的处理器

并发更多的是关于执行许多操作但不是必需的CPU密集型问题的多任务处理。

答案 3 :(得分:2)

我不认为这两个词有明确的不同含义。它们既是艺术术语,也是技术术语。

那就是说,我解释它们的方式是,如果它可以与其他东西同时完成,那么<​​em>并发,如果可以的话, parallel 由多个线程同时。我主要从JVM garbage collection documentation开始使用这个用法,它说的是

  

并发标记扫描收集器(也称为并发收集器或CMS)针对对垃圾收集暂停敏感的应用程序。它执行大多数垃圾收集活动并发,即在应用程序线程运行时

  

CMS收集器现在使用多个线程在具有多个处理器的平台上以并行执行并发标记任务。

不可否认,这是一个非常具体的背景,从中推广可能是不明智的。

答案 4 :(得分:2)

如果你使用线程编程(并发编程),它不一定会被执行(并行执行),因为它取决于机器是否可以处理多个线程。

这是一个直观的例子。非线程机器上的线程:

         --  --  --
      /              \
 >---- --  --  --  -- ---->>

线程机器上的线程:

       ------
      /      \
  >-------------->>

破折号代表执行的代码。正如您所看到的,它们分开并单独执行,但线程化的机器可以同时执行多个单独的部分。

请参阅此What is the difference between concurrent programming and parallel programming?

答案 5 :(得分:2)

来自oracle文档page

单处理器上的多线程进程中,处理器可以在线程之间切换执行资源,从而导致 并发执行

共享内存多处理器环境 t中的同一多线程进程中,进程中的每个线程可以同时在单独的处理器上运行,从而导致 并行执行

当进程拥有比处理器更少或更多的线程时,线程支持系统与操作环境一起确保每个线程在不同的处理器上运行。

Java SE 7通过添加ForkJoinPool API进一步增强了并行处理。

有关详细信息,请参阅以下帖子:

Parallel programming with threads in Java(特定于Java)

Concurrency vs Parallelism - What is the difference?(语言不可知)

答案 6 :(得分:0)

并发是一种体系结构设计模式,它允许您一次运行多个操作(可以但不必并行执行)。

在单个核心执行此类操作的情况下,可以通过例如上下文切换(假设您的编程语言将线程用于并行执行)来“模拟” parallelizm。

让我们说您有两个线程,在其中一个队列中加入了作业。第二个等待,直到有任何作业存在并选择执行。尽管使用了单个核心处理器,但它们都正在运行并通过队列进行通信。

这是并发执行-即使通过线程在单个内核上按顺序执行(共享)。


同一练习的并行版本看起来相似,但有一个区别:

线程执行将在多核处理器上进行。线程将彼此并行运行,而不是顺序运行(每个线程都在自己的内核上)。

答案 7 :(得分:0)

问题已经很久了,但是我想以一种非常简洁明了的方式总结这两个问题:

  1. 并发性- 由一个参与者进行多任务处理的想法:
    是x进程/线程数(x > 1)争夺相同资源。在并发的情况下,当在一个CPU上执行两个进程/线程时,它们实际上不是并行的,这意味着CPU时钟将以超快速的方式在进程之间来回切换,这将描绘出一种错觉。并行性,但同样-它是在不同进程/线程之间共享的1个CPU。想象一下要执行5条指令,它们竞争获得CPU资源以执行该指令;

  2. 并行性- 考虑多个任务,其中每个任务都由单独的参与者负责:
    是同时并行执行x个进程/线程(x> 1)。想象一下,如果有5个进程/线程,并且有5个CPU内核,这意味着每个内核可以独立执行每个线程/进程。