たまに以下のようなロジックで値の一意性を保証しようとしているコードを見かけます。 if ( 既に値が存在するか ) { ...(1) print "別の値にしてください" } else { 値をどっかに保存する処理 ...(2) print "保存しました" } 一見うまく動きそうなんですけど、これは複数プロセスや複数スレッドが同時に実行されるような環境ではうまく動きません。 例えばwebアプリでDBに値を保存する場合などは、こういうことが考えられます。 ユーザーAが nyan という値を送ってきます まだ DB には nyanという値が存在しないので、 (1) で else 節に入ります ここでユーザーBも偶然 nyan という値を送ってきました まだ DB には nyan という値が存在しないので、 (1) で else 節に入ります else 節に入ったユーザーAのリクエストは(2)