スレッド

複雑なスレッド管理が必要になるようなアプリケーションなんて、そうそうないような気がするということには、まあ、同意するな(って誰に?)。基本的には、スレッド間で情報をやり取りするための、いくつかの補助機構があれば、それで十分だとは思う。で、その個数自体も多分そんなに多くない。
ただ、共有変数を読み込んで、処理して、書き込むまでの間、共有変数の値が変わっていてほしくないようなケースがあって(つまり、それはトランザクション処理というやつなのだけれど)、これは出来合いの補助機構だけではうまく書けなくて、通常は共有変数のロックを取得して処理するのだけれど、代わりにSTMを使うと特定のケースではパフォーマンス上明らかに有利になるというところがうれしいんだろうと思う。
というか、明らかにSTMはスレッドプログラミングのややこしさを簡単にするというよりは倍増させているので、純粋関数型なプログラミングに慣れている人じゃなきゃやってられないはず。で、そういうのに慣れている人は、そもそもスレッドプログラミングが特別難しいとか感じないと思うのだな。
あと、遅延評価が利いている言語だと、一見レースコンディションになっていないように見えても、サンクを評価するタイミングによって勝手にレースコンディションになるので、そこら辺は処理系がうまく云々とかあるような気がする。