[英]How do I make this c# property threadsafe?
我有一些库实用程序,使事情变得更简单。
public static RequestUow Uow
{
get { return ContextItemsHelper.Get<RequestUow>("Uow"); }
set { ContextItemsHelper.Set<RequestUow>("Uow", value); }
}
并在ContextItemsHelper中
public static T Get<T>(string key)
{
Guard.NullOrEmpty(key, "key");
object obj = Items[key];
return obj.IsNotNull() ? (T)obj : default(T);
}
static IDictionary Items { get { return HttpContextHelper.Current.Items; } }
这工作正常,但我现在想检查属性uow是否为null,如果它设置了一个新的RequestUow并返回它。
我见过的例子涉及设置你自己的成员变量,但是我想知道这是否可能是线程安全的。
有人提供任何建议或解决方案吗?
使Items
成为ConcurrentDictionary并使用它的AddOrUpdate方法。 由于集合本身是线程安全的,因此您不必关心它。
如果您的Get
更改为以下内容也会更好:
public static T Get<T>(string key)
{
Guard.NullOrEmpty(key, "key");
return Items.GetOrAdd( key, (key) => default(T) );
}
这样,默认值在第一次尝试时添加,如果再次调用则返回。
使用模式双重检查锁定模式
只要字典没有变异(例如没有更新),访问它是完全线程安全的,没有任何额外的措施(*)。
请注意,如果包含的项目本身不是线程安全,则为字典设置线程安全的getter / setter没有帮助。 最安全的赌注是在字典中使用不可变项; 如果您的RequestUow
对象是可变的,那么您需要使用它们(以及可能使用此字典检索的所有其他内容)进行线程安全。
*:有关.NET中线程安全集合的信息,请参阅此PDF 。 第18页阐明了只读访问不需要额外测量线程安全性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.