.NET C#多线程

Mar*_*909 8 c# multithreading

关于线程以满足我的好奇心的问题......

假设我有静态变量_status(ProgressStatus),许多线程都是从这里读取的.要更新此静态变量,我使用不可变对象ProgressStatus,创建一个新实例,然后换出引用.

var status = new ProgressStatus (50, "Working on it"); //plus many more fields in constructor

lock (_statusLocker) _status = status; // Very brief lock
Run Code Online (Sandbox Code Playgroud)

这是读者代码

public GetProgressStatus () {

     var status = new ProgressStatus (_status.ID, _status.Description); 
     return status }
Run Code Online (Sandbox Code Playgroud)

如果我不使用锁,会发生什么最坏的情况?

Jon*_*eet 7

其他线程可能无法看到新值.

实际上,除非他们也锁定,否则他们仍有可能看不到新的价值.

尽管引用将以原子方式更新(即它永远不会是某些值,它是旧值和新值的混合),但它没有说明更改何时对其他线程可见 - 或者其他线程甚至会打扰检查.(例如,一个线程可能已将值缓存在寄存器中,并且没有任何迹象表明线程需要检查主内存,它可能不会这样做.)

通过声明变量可能volatile会避免这种情况 - 但我已经不再相信我确切地理解了什么volatile意思,说实话.

在处理共享可变数据(读取写入)时始终使用锁定会因锁定的语义而消失此问题.以无锁且保证正确的方式执行此操作需要更深入地了解正在发生的事情.(注意,这是变量,这里是可变的,即使它引用的对象不是.)