if(!lock)
と
lock = true
の間に、他のスレッドがlockの値を書き換える可能性がある
こんなチェックはなんのあてにもならない