次のようなコードがあります。
public class UserCache
{
private Dictionary<int, User> _users = new Dictionary<int, User>();
public User GetUser(int id)
{
User u = null;
lock (_users)
{
if (_users.containsKey(id))
return _users[id];
}
//The below line is threadsafe, so no worries on that.
u = RetrieveUser(id); // Method to retrieve from database;
lock (_users)
{
_users.Add(id, u);
}
return u;
}
}
辞書へのアクセスをロックしていますが、私のチームの誰かが、まだスレッドセーフではないと言っていました (説明なし)。質問は-これはスレッドセーフだと思いますか?
編集:解決策がどのようになるかを尋ねるのを忘れました。ユーザーの取得は時間のかかる操作であるため、メソッド全体をロックするつもりはないことに注意してください。