TL;DR
複数のプログラムやスレッドが同じメモリ領域にアクセスし、それを通じてデータをやり取りする方式。並行プログラミングでは、メッセージパッシングと並ぶ通信の方式である。
なぜ必要か
Wikipedia によると、共有メモリはプログラム間でデータを渡す効率の良い手段で、同じデータのコピーを複数持たずに済む。同じ仕組みは 1 つのプログラムの中のスレッド間の通信にも使える。
仕組み
The Go Blog によると、Java、C++、Python などの言語では、スレッドがメモリ共有で通信する。共有するデータ構造はロックで守り、スレッドはデータにアクセスするためにロックを奪い合う。Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス では、Mutex や条件変数をメモリ共有の古典的な基本操作として挙げている。
例
Go では、メモリ共有と、CSP 方式のチャネルのどちらでもアプリケーションを組み立てられる。Go は「メモリを共有して通信するな。通信してメモリを共有せよ」として、チャネルでデータへの参照を渡すことを勧めている。
注意点
Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス によると、メモリ消費を抑えたいときや、大きなメッセージを頻繁にやり取りするときは、メモリ共有が向いている。一方で、同期を誤ると競合状態やデータ競合が起きる。