引用线程安全
本文关键字:安全 线程 引用 | 更新日期: 2023-09-27 18:34:42
我很快在记事本上写了这个,如果有错误,我深表歉意。
我有两个类阿尔法和贝塔。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;
}
}
}
}
你对ThreadSafeProperty
的读取和写入将是原子的,如果这是线程安全所需要的,是的。如果您的实际用法如此简单,我建议您用Interlocked.Exchange()
替换lock
。
是的。你似乎对事情何时可以在"幕后"发生变化有点困惑。
-
ParentClass 是由线程初始值设定项传递的局部变量,然后不会更改。它(ParentClass(保存对Alpha的引用,这是线程安全的。因此,对父类的访问是安全的。
-
如前所述,锁定语句不会为您带来任何额外的安全保障。在 .net 变量库中,诸如 _notThreadSafe = value 之类的变量库保证是原子的,即如果整数长度为 4 个字节,则没有机会读取它,例如 2 个字节来自旧值,2 个字节来自新值。因此,除非你的getter/setter变得更复杂,否则你可以摆脱锁,只需写:
public int ThreadSafeProperty { get; set; }