我很快在记事本中写道,如果有错误,我道歉。
我有两个类Alpha和Beta。 Alpha仅暴露线程安全操作。 Beta在另一个线程上访问这些操作。这个线程安全吗?
将Alpha的引用传递给Beta线程是否安全?
示例:
public class Alpha
{
readonly private object key = new object();
private int _notThreadSafe = 0;
public int ThreadSafeProperty
{
set
{
lock(key)
{
_notThreadSafe = value;
}
}
get
{
int temp;
lock(key)
{
temp = _notThreadSafe;
return temp;
}
}
}
public Alpha()
{
Thread ClientThread = new Thread(delegate()
{
new Beta(this);
});
ClientThread.Start();
}
public class Beta
{
public Beta(Alpha ParentClass)
{
if(ParentClass != null)
{
ParentClass.ThreadSafeProperty = 1;
}
}
}
}
答案 0 :(得分:1)
您对ThreadSafeProperty
的读写将是原子的,如果这是线程安全所需要的,是的。如果您的实际使用情况如此简单,我建议您使用lock
替换Interlocked.Exchange()
。
答案 1 :(得分:0)
是。当事情发生变化时,你似乎有点困惑"在封面下#34;。
ParentClass是一个局部变量,由线程初始化程序传递,然后不会更改。它(ParentClass)包含对Alpha的引用,这是线程安全的。因此,对ParentClass的访问是安全的。
如上所述,锁定声明不会为您带来任何额外的安全性。在.net中,诸如_notThreadSafe = value的变量设置器保证是原子的,即如果整数长度为4个字节,则没有机会读取它,例如, 2个字节来自旧值,2个字节来自新值。因此,除非你的getter / setter变得更复杂,否则你可以摆脱锁定,只需写下:
public int ThreadSafeProperty { get; set; }