C#静态字段锁定

时间:2010-08-25 09:59:27

标签: c# multithreading locking

我是否需要锁定_userByNameQuery静态字段是/否和方式?

public class SomeClass 
{
    static Func<Entities, string, IQueryable<User>> _userByNameQuery = 
        CompiledQuery.Compile<Entities, string, IQueryable<User>>
            ((context, userName) =>
                context.Users.Where(u => u.UserName.ToUpper() == userName));

    public bool UserNameExists(string userName)
    {
        userName = userName.ToUpper();
        return _userByNameQuery.Invoke(DataContext, userName).Count() > 0;
    }
}

2 个答案:

答案 0 :(得分:3)

让它只读,而你没有。它将在类型初始化的一部分初始化一次,并且委托是不可变的。没问题。

答案 1 :(得分:1)

标准做法是使静态成员具有线程安全性。原因是因为您无法控制哪些线程正在访问静态成员,就像您可以访问实例成员一样。但是,这并不意味着您必须使用锁。就像Jon说的那样,如果你确保该字段永远不会改变,那个字段引用的实例是不可变的那么你就没什么可担心的了。不需要锁定。