我正在Google上做一些研究,但是无法完全理解Java中并发程序和并行程序之间的差异(如果有的话)。我查看的一些信息表明两者之间没有区别。这是真的吗?
我正在Google上做一些研究,但是无法完全理解Java中并发程序和并行程序之间的差异(如果有的话)。我查看的一些信息表明两者之间没有区别。这是真的吗?
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());
getId()
,甚至不需要在列表开头的项目被过滤或映射之前就处理列表末尾的项目。根据从getItems()
返回的Iterable
类型,给定的操作可能会或可能不会并行运行,但你编写的代码是并发的。我认为这取决于你的定义,但我的理解大致如下:
就我所知,这两个术语都不特定于Java,也没有任何Java特定的细微差别。
并行化(或并行计算)是一种计算方式,许多计算可以同时进行。本质上,如果一个消耗大量 CPU 的问题可以被分解成更小的独立任务,那么这些任务可以被分配给不同的处理器。
并发性 更多的是关于多任务处理,即执行许多操作但不一定是消耗大量 CPU 的问题。
-- -- --
/ \
>---- -- -- -- -- ---->>
在多线程的机器上运行的线程:
------
/ \
>-------------->>
这些短横线代表已执行的代码。您可以看到,它们都被分开并单独执行,但是线程化机器可以同时执行几个独立的部分。
并发是一种架构设计模式,允许您同时运行多个操作(可以但不必要并行执行)。
在单核执行这些操作的情况下,可以通过上下文切换来“模拟”并行性(假设您的编程语言使用线程进行并行执行)。
假设您有两个线程,在一个线程中,您排队作业。第二个线程等待任何作业存在并将其选取进行执行。尽管使用单个核处理器,但它们都在运行并通信(通过队列)。
这是一种并发执行方式 - 即使线程在单个核上顺序执行(共享它)。
同一练习的并行版本看起来类似,但有一个区别:
线程的执行将在多核处理器上进行。线程将并行运行,而不是顺序运行(每个线程在自己的核心上运行)。
这个问题很老了,但我想用非常清晰简洁的方式总结这两个概念:
并发 - 可以将其视为单个参与者的多任务处理:
当x个进程/线程(x>1)竞争同一资源时,就会出现并发。在并发情况下,当两个进程/线程在一个CPU上执行时,它们实际上并不是并行的,也就是说,CPU时钟会以超快的速度在进程/线程之间来回切换,从而产生并行的假象,但实际上它们共享同一个CPU。想象一下有5条指令需要执行,并且它们竞争获取CPU资源以便执行;
并行 - 可以将其视为由多个参与者独立完成的多个任务:
当x个进程/线程(x>1)同时执行时,就会出现并行。想象一下有5个进程/线程和5个CPU核心,这意味着每个核心可以独立地执行每个线程/进程。