当多个线程将通过 get/set 函数访问属性/字段时,是否有必要锁定 getter 和 setter。
例如:
您有一个计时器,它定期获取对象的值。以及定期更新此值的过程。
public class Task : IProgressProvider
{
...
public Progress GetProgress()
{
// should i lock here?
return _progress;
}
public SetProgress(Progress progress)
{
// and lock here?
_progress = progress;
}
public void Execute()
{
// ...
SetProgress(new Progress(10));
// ...
SetProgress(new Progress(50));
// ...
SetProgress(new Progress(100));
}
}
public class ProgressReporter
{
public ProgressReporter()
{
_timer = new Timer();
_timer.Elapsed += Elapsed;
// ...
}
// ...
public void Elapsed(...)
{
var progress = _task.GetProgress();
// ...
}
}
又是一个问题:
- 我是否应该锁定 GetProgress 和 SetProgress 函数。
- 如果是,为什么?
- 在这种情况下是否需要 volatile(假设一个或多个处理器内核)
- 为了保持“简单”,我们假设 Progress 的属性/字段是只读的。编辑:我知道 += 等不是原子操作,需要正确处理(fe 锁定)
我认为变量 _progress 的设置和读取是原子操作。GetProgress 将获得非常非常当前的值并不重要。如果这次不是,它将在下一次调用 GetProgress 时得到它。