>>444
そのコードだとGをvolatile宣言する必要はナシ。
そもそも、volatile宣言された変数へのアクセスって
意外とコスト高なんで注意すべし。

ちなみに>>444のアルゴリズムはDouble-Checked Lockingと
呼ばれているんだが、場合によってはうまく動かないことが
知られている。

具体的には、初期化の対象がatomicなアクセスが保証されている
primitive型の変数ではなく、緩いメモリモデルを採用している
プラットホーム上で動かした場合に、うまく動かない可能性がある。
緩いメモリモデルの例としてはJava memory modelとかがあるから
参考として以下の記事なんかを読んでおくのもいいよ。
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html