c#线程安全属性,没有锁的getter呢?

我们有一些性能问题,正在考虑从一些经常使用的属性中取出一些线程安全锁。更准确地说,仅来自访问修饰符 getter。改进之处在于,如果某个其他线程正在对同一属性进行获取,则 setter 访问修饰符不再“被阻止”。


-> 当然,必须确保如果让我们说一个整数类型,例如位值 11110011 是 243,一旦开始写入,所有位都会被写入。必须确保写入线程永远不会未完成,并且获取线程成为一些半写入位,从而导致错误值。是这样吗?


如果是这样,该概念是否可用于所有 .net 内置数据类型,也可用于字符串?


请参阅以下显示概念的代码示例:


    // for properties used just the "Built-In Types"

    // doc: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/built-in-types-table


    private int _ActualValue = 0;

    private readonly object _Lock_ActualValue = new object();

    public int ActualValue

    {

        get

        {

            //lock(_Lock_ActualValue)  <- remove lock for access modifier get ?

            //{

                return _ActualValue;

            //}

        }

        set

        {

            lock (_Lock_ActualValue)

            {

                if((value != _ActualValue) && (value < 1000))

                {

                    Log("_ActualValue", value.ToString());

                    _ActualValue = value;

                }

            }

        }

    }


富国沪深
浏览 313回答 2
2回答

精慕HU

根据经验,永远不要将优化置于线程安全之上。这被广泛认为是一种不好的做法,是许多问题的直接结果。话虽这么说,没有它永远不会半值写入到一个原子对象,如您int ActualValue。如果您在获取时不关心值的完全准确性,您的方法实际上很好。编辑总的来说,机器代码中的任何多步操作都不是原子的。为了澄清我上面的答案,在 java 中bool, ,&nbsp;char,&nbsp;byte,&nbsp;sbyte,&nbsp;short,&nbsp;ushort,&nbsp;int,&nbsp;uint, 和float类型都有原子写入,因此不会写一半。然而,decimal,double,long,ulong,和DateTime类型没有原子写入,从而可能被部分写入。

慕丝7291255

private ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();private int _ActualValue = 0;public int ActualValue{&nbsp; &nbsp; get&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; lockObj.EnterReadLock();&nbsp; &nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return _ActualValue;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; finally&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lockObj.ExitReadLock();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; set&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; lockObj.EnterWriteLock();&nbsp; &nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if((value != _ActualValue) && (value < 1000))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log("_ActualValue", value.ToString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ActualValue = value;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; finally&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lockObj.ExitWriteLock();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP