考虑以下两种情况:
//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个不同角色和超过一千个用户的Web环境中使用,那么[Broker]场景中的哪个场景将最佳扩展。
注意:随意采取任何替代方法。
答案 0 :(得分:5)
您可以使用静态类或实例类来破坏线程。但是,正确获取线程的关键是确保两个线程不会同时尝试访问同一个资源。
对于静态类,根据定义,它只有一个副本,所有线程都需要很好地共享。
使用实例类,您可以为每个线程创建一个实例。如果确保每个线程只访问它自己的实例,并且实例属性和方法不依次访问其他共享资源,那么它们应该是线程安全的。
在你的情况下,我没有看到初始化后类中有任何改变。如果你确保以线程安全的方式初始化静态类(这里似乎是这种情况),静态变量应该是线程安全的(因为对变量的只读访问)并且会更快一点,因为你没有创建和处理实例的开销。
答案 1 :(得分:2)
这两种方法都有自己的问题。我通常的方法是去实例类(因为它们也更容易测试)但是如果你想要每线程数据,你可以定义该类的静态实例。在任何情况下,如果要共享您的数据,您可能需要investigate the ReaderWriterLockSlim
class。
答案 2 :(得分:1)
实例类将更加线程安全,因为每个线程每个线程可以有一个副本,另一方面,静态类只能有一个,如果需要线程共享数据,请确保实现某种锁定机制他们彼此玩得很好。 还要指定您需要速度或资源消耗的效率上下文。
答案 3 :(得分:0)
没有绝对更多的线程安全选择,如果你不打算访问共享数据,没有区别,如果你是,仍然没有区别,但静态类更可能使用共享数据,因为它们是静态的,几乎所有的东西都是共享的。所以使用即时课程。作为Martin Fowler的Singleton模式,即使你想要一些静态的东西,最好还是让它成为单身,因为它更灵活。