Komunikacja między współbieżnymi zadaniami może być niejawna, ale najczęściej mamy do czynienia z jawną komunikacją przy użyciu jednego z dwóch podstawowych mechanizmów:
- Wspólna pamięć: porozumiewanie się następuje przez zmianę wartości umówionych komórek pamięci. Ten mechanizmu jest związany z paradygmatem imperatywnym
- Przekazywanie komunikatów: ta metoda wymaga w praktyce bardziej rozbudowanego wsparcia ze strony systemu operacyjnego, ale jest łatwiejsza do matematycznego okiełznania — co powinno sprzyjać poprawności programów.
Mimo iż programowanie współbieżne liczy już praktycznie kilkadziesiąt lat (pierwsze współbieżne systemy operacyjne powstały na początku lat 60-tych XX wieku), znajduje ono słabe odbicie w językach programowania. Przez długie lata było ono głównie domeną twórców systemów operacyjnych, później pojawiło się w innych dziedzinach, np. w oprogramowaniu dla telekomunikacji, na potrzeby którego powstał język Erlang, obejmujący obsługę współbieżnych procesów. Innym przykładem języka z wbudowaną mechanizmami obsługi współbieżności jest Ada. Aktualnie duża część programowania współbieżnego ma miejsce w Javie, choć wsparcie dla współbieżności w samym języku jest raczej elementarne. To Java przyczyniła do rozpowszechnienia programowania współbieżnego.