为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
富国沪深 2021-11-28 19:51:11
我们有一些性能问题,正在考虑从一些经常使用的属性中取出一些线程安全锁。更准确地说,仅来自访问修饰符 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;                }            }        }    }
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

根据经验,永远不要将优化置于线程安全之上。这被广泛认为是一种不好的做法,是许多问题的直接结果。话虽这么说,没有它永远不会值写入到一个原子对象,如您int ActualValue。如果您在获取时不关心值的完全准确性,您的方法实际上很好。

编辑

总的来说,机器代码中的任何多步操作都不是原子的。为了澄清我上面的答案,在 java 中bool, , charbytesbyteshortushortintuint, 和float类型都有原子写入,因此不会写一半。然而,decimaldoublelongulong,和DateTime类型没有原子写入,从而可能被部分写入。


查看完整回答
反对 回复 2021-11-28
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

private ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();


private int _ActualValue = 0;

public int ActualValue

{

    get

    {

        lockObj.EnterReadLock();


        try

        {

            return _ActualValue;

        }

        finally

        {

            lockObj.ExitReadLock();

        }

    }

    set

    {

        lockObj.EnterWriteLock();

        try

        {


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

            {

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

                _ActualValue = value;

            }

        }

        finally

        {

            lockObj.ExitWriteLock();

        }

    }

}



查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 312 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信