web-dev-qa-db-fra.com

Existe-t-il une différence entre la concurrence et le parallélisme en Java?

J'ai fait des recherches sur Google et je n'arrive pas à comprendre les différences (le cas échéant) entre les programmes simultanés et parallèles en Java. Certaines des informations que j'ai examinées ne suggèrent aucune différence entre les deux. Est-ce le cas ??

34
user1877082

Cela dépend de qui le définit. Les personnes qui ont créé le langage de programmation Go appelez le code Concurrent s'il est décomposé en morceaux qui pourraient être traités en parallèle, tandis que le parallélisme implique que ces pièces fonctionnent réellement en même temps.

Puisqu'il s'agit de principes de programmation, le langage de programmation n'a aucune incidence sur leur définition. Cependant, Java 8 aura plus de fonctionnalités pour permettre la simultanéité et le parallélisme sans trop gâcher votre code. Par exemple, un code comme celui-ci:

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

... qui n'est pas simultané et non parallèle, pourrait être écrit comme ceci (ma syntaxe est probablement fausse, mais j'espère que vous avez l'idée):

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

Le code ci-dessus est écrit de manière concurrente : aucun des codes donnés ne nécessite que les coolItems soient filtrés un par un, ou que vous ne pouvez appeler que getId() sur un élément à la fois, ou même que les éléments au début de la liste doivent être filtrés ou mappés avant les éléments à la fin. Selon le type de Iterable renvoyé par getItems(), les opérations données peuvent ou non s'exécuter en parallèle , mais le code que vous avez écrit est simultané .

Également intéressant:

21
StriplingWarrior

Je suppose que cela dépend de vos définitions, mais ma compréhension va à peu près comme ceci:

  • Concurrence se réfère à des choses qui se produisent dans un ordre non spécifié. Le multitâche - exécuter plusieurs programmes en entrelaçant des instructions via le découpage temporel - est un bon moyen de penser à ce sentiment de concurrence.
  • Parallélisme (ou "vrai" parallélisme) fait référence à des choses qui se produisent littéralement en même temps. Cela nécessite un support matériel (coprocesseurs, processeurs multicœurs, machines en réseau, etc.). Tout parallélisme est simultané, mais toutes les concurrences ne sont pas parallèles.

Pour autant que je sache, aucun des deux termes n'est spécifique à Java ou n'a de nuances spécifiques à Java.

16
Patrick87

Parallelization (ou Parallelism ou Parallel computing) est une forme de calcul dans laquelle de nombreux calculs sont effectués simultanément. En substance, si un problème gourmand en CPU peut être divisé en tâches plus petites et indépendantes, ces tâches peuvent être affectées à différents processeurs

Concurrence concerne davantage le multitâche qui exécute de nombreuses actions mais pas un problème intensif en CPU.

5
Alexandar

Je ne pense pas que les deux termes aient des significations distinctes bien définies. Ce sont des termes d'art plutôt que des termes techniques.

Cela dit, la façon dont je les interprète est que quelque chose est simultané si cela peut être fait en même temps que d'autres choses, et parallèle s'il peut l'être fait par plusieurs threads en même temps. Je prends cette utilisation en grande partie de la documentation de la récupération de place JVM , qui dit des choses comme

Le collecteur de balayage de marques simultanées , également connu sous le nom de collecteur simultané ou CMS , cible les applications sensibles aux pauses de récupération de place. Il effectue la plupart des activités de récupération de place simultanément , c'est-à-dire pendant l'exécution des threads d'application

et

CMS collector now utilise plusieurs threads pour effectuer la tâche de marquage simultanée en parallèle sur les plates-formes avec plusieurs processeurs.

Certes, il s'agit d'un contexte très spécifique, et il n'est probablement pas judicieux d'en généraliser.

3
Tom Anderson

Si vous programmez en utilisant des threads (programmation simultanée), cela ne sera pas nécessairement exécuté en tant que tel (exécution parallèle), car cela dépend si la machine peut gérer plusieurs threads.

Voici un exemple visuel. Threads sur une machine non filetée:

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

Threads sur une machine filetée:

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

Les tirets représentent le code exécuté. Comme vous pouvez le voir, ils se séparent et s'exécutent séparément, mais la machine filetée peut exécuter plusieurs pièces distinctes à la fois.

Veuillez vous référer à ceci Quelle est la différence entre la programmation simultanée et la programmation parallèle?

2
mahi

Depuis la documentation Oracle page :

Dans un processus multithread sur un processeur unique , le processeur peut basculer les ressources d'exécution entre les threads, ce qui entraîne exécution simultanée.

Dans le même processus multithread dans un environnement multiprocesseur à mémoire partagée t, chaque thread du processus peut s'exécuter en même temps sur un processeur distinct, ce qui entraîne exécution parallèle.

Lorsque le processus a moins ou autant de threads qu'il y a de processeurs, le système de prise en charge des threads conjointement avec l'environnement d'exploitation garantit que chaque thread s'exécute sur un processeur différent.

Java SE 7 a encore amélioré le traitement parallèle en ajoutant ForkJoinPool API.

Référez-vous aux articles ci-dessous pour plus de détails:

Programmation parallèle avec des threads en Java (Java spécifique)

Concurrence vs Parallélisme - Quelle est la différence? (Language agnostic)

2
Ravindra babu

La concurrence est un modèle de conception architecturale, qui vous permet d'exécuter plusieurs opérations à la fois (qui ne doivent pas nécessairement être exécutées en parallèle).

Dans le cas d'une seule exécution de base de telles opérations, le parallélisme peut être "simulé" par exemple en changeant de contexte (en supposant que votre langage de programmation utilise des threads pour l'exécution en parallèle).

Disons que vous avez deux threads, en un, vous mettez en file d'attente les travaux. Le second attend jusqu'à ce qu'un travail existe et le ramasse pour exécution. Malgré l'utilisation d'un processeur à cœur unique, les deux fonctionnent et communiquent (via la file d'attente).

Il s'agit d'une exécution simultanée - même si les threads sont exécutés séquentiellement sur un seul cœur (partagez-le).


La version parallèle du même exercice ressemblerait à une différence:

L'exécution des threads se produirait sur un processeur multicœur. Les threads s'exécuteraient en parallèle et non de manière séquentielle (chacun sur son propre noyau).

1
Daniel Hajduk