>>535
Javaのメモリオーダーとロックとvolatileは確かに関係がある。

しかしそんなに突飛な話ではない。

・1つのロックを複数のスレッドが同時にacquireすることは決し
 て無い。
・ロックを保持するスレッドがunlockする前に、そのスレッドが
 行った変数の更新はすべてメインメモリに書き込まれることが
 保証される。synchronized から抜けるごとに、そのスレッド
 のキャッシュがメモリに書きもどされると思って良い。
・スレッドがロックを獲得してから変数を読むと、必ずメインメ
 モリから読まれる。synchronizedに入るごとにキャッシュが無
 効化されると思って良い。
・volatileな変数については、キャッシュせずに毎回メモリから
 読み書きされる。

なので今回の話で言えば、

・synchronizedなメソッドinc()に1つのスレッドが入っていると
 き、他のスレッドはinc()やget()に入れない。
・スレッドがinc()から抜けたら、そのスレッドが変更したidxの
 値はメインメモリに書き込まれる。
・スレッドがinc()やget()に入ったら、メインメモリからidxの
 値が読み出される。(だから、前にinc()したスレッドの変更が
 ちゃんと伝わる。)
・もしidxをvolatileにしたら、変数が出てくるたびにメインメ
 モリへの読み書きが起きる。(だから、synchronizedしないで
 も読み書きの結果は他のスレッドにちゃんと伝わる。)

というだけの話。Javaプログラマならみんな理解している通り。

(>>531は477か、あるいは非常に意地の悪い上級者。)