In my developer haze, I’ve always convoluted Concurrency with Asynchronous Programming, though they address distinctly separate issues. That is because when I engineer an architecture requiring concurrent processing, the principals of asynchronous programming always come into play.
My world-view comes from decades of UI coding, where the event queue is master and one must play by its rules. Making mind-blowing visual processes work simultaneously, or at least appear to, made concurrency and asynchronousity one and the same in my mind.
In my euphoria, I already see the ascendance of asynchronous programming design patterns (e.g. “callbacks”,” futures”, “promises”) to the point where it’s taught in Software 101. These patterns will in turn lead to complementary concurrency patterns. And all will be optimized in the compiler and runtime engines.
Asynchronous programming is both the gateway drug and enabler for true, concurrent systems.
If this makes you hungry, I recommend “The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software” by Herb Sutter.