【发布时间】:2010-11-27 01:39:50
【问题描述】:
关于线程以满足我的好奇心的问题......
假设我有静态变量 _status (ProgressStatus) 并且许多线程正在从中读取。 为了更新这个静态变量,我使用了一个不可变对象 ProgressStatus,创建一个新实例,然后换出引用。
var status = new ProgressStatus (50, "Working on it"); //plus many more fields in constructor
lock (_statusLocker) _status = status; // Very brief lock
这是阅读器代码
public GetProgressStatus () {
var status = new ProgressStatus (_status.ID, _status.Description);
return status }
如果我不应用锁,可能发生的最坏情况是什么?
【问题讨论】:
-
向我们展示阅读器代码也很重要。顺便说一句,object 的不变性并不能解决所有问题,分配引用的事实也不是原子的。如果 reference 在操作中间被另一个线程更改,
Console.WriteLine(status.Progress + ", " + status.Text)可能仍然 产生类似"50, Complete"的东西。我想你必须决定这种不一致是否可以接受。 -
好点。当我编写阅读器代码时,我也意识到了这一点 - 哈哈
标签: c# multithreading