あ...私もところかまわずvolatile使いまくってるわけじゃないです.

例えば,
bool 型の変数(初期値false)があって,ある一つのスレッドが,
その値をtrueに変更し,他のスレッドは,その変数の値が
trueになるのを待ち構えている...的な状況に使っています.

同期オブジェクト使えばいいじゃん.と思われるかもしれませんが,
例えば,上のbool型の変数がグローバル変数であった場合,
単純に同期オブジェクトに置き換えることも出来ません.
初期化の問題もあるし,それをクリアしてもリソースをいつ
OSに返せばいいかという問題もあります.

より具体的には,
http://www-6.ibm.com/jp/developerworks/java/040416/j_j-jtp02244.html
の後半にある,
「リスト1. volatileフィールドを「見張り」変数として使う」
的な利用の仕方をしています.

上記サイトは言語がjavaですし,古いjavaのメモリ・モデルでは,
最適化のリオーダの定義が甘く,うまく動かないと結論づけらているので,
あんまり適切なソースではありませんが,私が提示できるのはこれくらいです.