O que é concorrência em computação? Olhando a entrada de concurrency na Wikipedia em Inglês:
In computer science, concurrency is the decomposability property of a program, algorithm, or problem into order-independent or partially-ordered components or units. This means that even if the concurrent units of the program, algorithm, or problem are executed out-of-order or in partial order, the final outcome will remain the same.
Aqui duas idéias são importantes, (1) order-independent (ordem independente) e (2) partially-ordered components (parcialmente ordenados). Explicando, digamos que um sistema possua uma ação A e uma ação B. Se A não causa B e B não causa A, então temos uma ordem independente (1). Se A causa B então aqui temos uma ordem parcial (2).
Um programa que possui a propriedade (1) permite uma execução em qualquer ordem da ação (primeiro A, depois B; primeiro B, depois A) já a propriedade (2) permite que ordens distintas (A causa B e X causa Y) possam ser executadas (sequencialmente) como A, B, X, Y ou X, Y, A, B ou A, X, B, Y ou X, A, B, Y. No final do processamento dessas ações, o resultado tem que ser o mesmo para qualquer variante.
This allows for parallel execution of the concurrent units, which can significantly improve overall speed of the execution in multi-processor and multi-core systems.
Se eu tenho mais de uma unidade de processamento, então posso explorar a concorrência para utilizar os recursos paralelos que disponho. Nos exemplos anteriores, em (1) eu posso executar paralelamente A, B e em (2) eu posso executar paralelamente A, X e depois B e Y. Mas executar simultaneamente A, Y antes de X violaria a ordem parcial.
Quero dizer como ações A, B algo do tipo: escrever um valor num local de memória (ação A) e ler do mesmo local de memória (ação B).