2010-04-19 38 views
2

考虑以下两种情况:C# - 哪个更高效且线程安全?静态或即时课程?

//Data Contract 
public class MyValue 
{ 
} 

方案1:使用静态辅助类。

public class Broker 
{ 
    private string[] _userRoles; 

    public Broker(string[] userRoles) 
    { 
     this._userRoles = userRoles; 
    } 

    public MyValue[] GetValues() 
    { 
     return BrokerHelper.GetValues(this._userRoles); 
    } 
} 

static class BrokerHelper 
{ 
    static Dictionary<string, MyValue> _values = new Dictionary<string, MyValue>(); 
    public static MyValue[] GetValues(string[] rolesAllowed) 
    { 
     return FilterForRoles(_values, rolesAllowed); 
    } 
} 

方案2:使用一个实例类。

public class Broker 
{ 
    private BrokerService _service; 

    public Broker(params string[] userRoles) 
    { 
     this._service = new BrokerService(userRoles); 
    } 

    public MyValue[] GetValues() 
    { 
     return _service.GetValues(); 
    } 
} 

class BrokerService 
{ 
    private Dictionary<string, MyValue> _values; 
    private string[] _userRoles; 

    public BrokerService(string[] userRoles) 
    { 
     this._userRoles = userRoles; 
     this._values = new Dictionary<string, MyValue>(); 
    } 

    public MyValue[] GetValues() 
    { 
     return FilterForRoles(_values, _userRoles); 
    } 
} 

哪[经纪人]方案将如果在一个网络环境中约100个不同的角色和超过一千用户使用最佳尺度。

注:随意采取任何替代方法。

回答

5

您可以使用静态或实例类来搞定线程。但是,正确获取线程的关键是确保两个线程不会同时尝试访问相同的资源。

对于静态类,根据定义,它只有一个副本,因此所有线程都需要很好地共享。

通过实例类,您可以为每个线程创建一个实例。如果确保每个线程只访问它自己的实例,并且实例属性和方法不会反过来访问其他共享资源,则它们应该是线程安全的。

在你的情况,我没有看到任何东西在初始化后在类中被改变。如果你确保以线程安全的方式初始化你的静态类(这里似乎是这种情况),静态变量应该是线程安全的(因为只读访问变量),并且会更快一些,因为你没有创建和处理实例的开销。

2

这两种方法都有它们自己的问题。我通常的做法是去实例类(因为它们也更容易测试),但是如果你想要每线程数据,你可以定义该类的静态实例。无论如何,如果您的数据将被共享,您可能需要investigate the ReaderWriterLockSlim class

1

实例类会更安全,因为每个线程每个线程可以有一个副本,另一方面,静态类只能有一个,所以如果您需要线程共享数据,请确保实现某种锁定机制这样他们可以很好地相处。 还指定您需要速度或资源消耗的效率的上下文。

+0

他似乎没有在初始化后编写任何数据。 – 2010-04-19 16:35:10

0

没有绝对的线程安全选择,如果你不打算访问共享数据,没有区别,如果你是,仍然没有区别,但静态类更可能使用共享数据,因为它们是静态的,几乎所有的东西都是共享的。所以使用即时课程。作为Martin Fowler的Singleton模式,即使你想要静态的东西,最好使它成为单例模式,因为它更加灵活。