引用线程安全

本文关键字:安全 线程 引用 | 更新日期: 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

是的。你似乎对事情何时可以在"幕后"发生变化有点困惑。

  1. ParentClass 是由线程初始值设定项传递的局部变量,然后不会更改。它(ParentClass(保存对Alpha的引用,这是线程安全的。因此,对父类的访问是安全的。

  2. 如前所述,锁定语句不会为您带来任何额外的安全保障。在 .net 变量库中,诸如 _notThreadSafe = value 之类的变量库保证是原子的,即如果整数长度为 4 个字节,则没有机会读取它,例如 2 个字节来自旧值,2 个字节来自新值。因此,除非你的getter/setter变得更复杂,否则你可以摆脱锁,只需写:

    public int ThreadSafeProperty { get; set; }