参考线程安全

时间:2014-12-19 21:13:47

标签: c#

我很快在记事本中写道,如果有错误,我道歉。

我有两个类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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您对ThreadSafeProperty的读写将是原子的,如果这是线程安全所需要的,是的。如果您的实际使用情况如此简单,我建议您使用lock替换Interlocked.Exchange()

答案 1 :(得分:0)

是。当事情发生变化时,你似乎有点困惑"在封面下#34;。

  1. ParentClass是一个局部变量,由线程初始化程序传递,然后不会更改。它(ParentClass)包含对Alpha的引用,这是线程安全的。因此,对ParentClass的访问是安全的。

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

    public int ThreadSafeProperty { get; set; }