2 回答
TA贡献1845条经验 获得超8个赞
根据经验,永远不要将优化置于线程安全之上。这被广泛认为是一种不好的做法,是许多问题的直接结果。话虽这么说,没有它永远不会半值写入到一个原子对象,如您int ActualValue
。如果您在获取时不关心值的完全准确性,您的方法实际上很好。
编辑
总的来说,机器代码中的任何多步操作都不是原子的。为了澄清我上面的答案,在 java 中bool
, , char
, byte
, sbyte
, short
, ushort
, int
, uint
, 和float
类型都有原子写入,因此不会写一半。然而,decimal
,double
,long
,ulong
,和DateTime
类型没有原子写入,从而可能被部分写入。
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();
}
}
}
- 2 回答
- 0 关注
- 312 浏览
添加回答
举报