Concurence
La programmation concurrente permet l'exécution de programmes en parallèle, dans un réseaux de machines ou sur un seul calculateur. À l'heure où les processeurs multicoeurs sont devenus un standard, ce paradigme est désormais incontournable et même nécessaire, et concerne tous les développeurs. L'écriture d'un code qui exploite efficacement la puissance des nouveaux processeurs et supporte les environnements concurrents représente une difficulté à la fois en termes d'architecture, de programmation et de tests.
La concurrence est indispensable lorsque l'on souhaite écrire des programmes interagissant avec le monde réel (qui est concurrent) ou tirant parti de multiples unités centrales (couplées, comme dans un système multiprocesseurs, ou distribuées, éventuellement en grille ou en grappe).
Le problème central pour une telle programmatiion que le developpeur doit maitriser est l'indermisisme de l'ordre d'exécution d'une part et l'abscence d'états global d'autre part: Dans programme non concurrent, ou séquentiel, l'ordre d'exécution des instructions élémentaires du programme est un ordre total qui reste le même d'une exécution à l'autre pour les mêmes paramètres en entrée. Dans un programme concurrent, l'exécution forme un ordre partiel. Comme la politique d'ordonnancement est généralement inconnue (elle est déterminée par le noyau du système d'exploitation par exemple) ou incontrôlée, on parle de l'indéterminisme de l'ordre d'exécution.