キャッシュクリアとnullチェック

雪が降った。新宿文化クイントビル正面


よく出てくるのでメモ。

原則
キャッシュを取得し、変数に格納してからnullチェックをする。
アンチパターン
キャッシュのnullチェックを行い、キャッシュ!=nullだったらキャッシュ取得して変数に格納
アンチパターンに潜在するバグ
「キャッシュ!=null」の場合、次にキャッシュを取得して変数に格納し業務ロジックが走るが、このキャッシュ取得時には「キャッシュ == null」に変化している可能性がある。

つまり、以下の順序が問題になるわけなのです。

  1. キャッシュのnullチェック→nullじゃなかった
  2. キャッシュが消えた!*1
  3. キャッシュを取得して変数に格納した(この段階で変数の参照先はnull)
  4. 変数を利用した業務ロジックでぬるぽ例外発生


「.NETエンタープライズWebアプリケーション開発技術大全〈Vol.3〉ASP.NET応用編」の139ページに解説があります。

*1:キャッシュはタイマーや容量の関係等で、いつ消えてもおかしくない