我正在尝试在C#中创建线程安全属性,我想确保我在正确的路径上 - 这就是我所做的 -
private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice
{
get
{
lock (AvgBuyPriceLocker)
{
return _AvgBuyPrice;
}
}
set
{
lock (AvgBuyPriceLocker)
{
_AvgBuyPrice = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
阅读这篇文章,似乎这不是正确的做法 -
但是,这篇文章似乎暗示,
http://www.codeproject.com/KB/cs/Synchronized.aspx
有没有人有更明确的答案?
编辑:
我想为此属性执行Getter/Setter的原因是b/c我实际上希望它在设置时触发事件 - 所以代码实际上就像这样 -
public class PLTracker
{
public PLEvents Events;
private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice
{
get
{
lock (AvgBuyPriceLocker)
{
return _AvgBuyPrice;
}
}
set …Run Code Online (Sandbox Code Playgroud) 看到发生这种情况的一些代码示例:
public class Foo
{
string[] m_workID;
public string[] WorkID
{
get
{
return m_workID;
}
private set
{
m_workID = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有什么意义?由于使用m_workID不必要.
我正在向我的库添加依赖注入,我使用Unity.我想知道我是否需要采取一些额外的步骤来使Unity Container成为线程安全的.我找到了几篇关于线程安全容器的文章(例如:http://www.fascinatedwithsoftware.com/blog/post/2012/01/04/A-Thread-Safe-Global-Unity-Container.aspx)但我不明白我的项目是否真的需要它.从一方面来看,我不希望由于来自另一方的竞争条件而产生一些令人讨厌的错误,我不知道在什么情况下会出现竞争条件.我想使用Unity与Composition Root模式并在静态构造函数中注册所有类型:
internal static class ConfiguredUnityContainer
{
private static readonly UnityContainer Container = new UnityContainer();
static ConfiguredUnityContainer()
{
Container.RegisterType<IConnectionFactory<SqlConnection>>();
}
public static T Resolve<T>()
{
return Container.Resolve<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
所以,基本上我的问题是:在我使用Unity DI时,在什么情况下我还需要额外的线程安全?我在哪里可以获得竞争条件或线程安全问题?