C#中局部变量是否始终具备volatile特性?
C#中局部变量是否始终具备volatile特性?
结论:局部变量不会始终具备volatile特性,你给出的两个类里的num,其volatile特性完全不一致。
两类中num的特性对比
ThreadSafeObjectA中的num
这里的num是显式标记了volatile的类字段:
volatile修饰符会约束编译器和CLR,禁止对该字段的读写操作进行指令重排、本地缓存等优化;- 确保多线程环境下,对
num的读写操作都是直接访问内存,保证线程间的可见性。
ThreadSafeObjectB中的num
这里的num是被lambda表达式捕获的局部变量:
- C#编译器会自动将被捕获的局部变量包装为一个编译器生成类的字段,但这个字段不会自动添加
volatile修饰; - 对该
num的读写可能被编译器或CPU进行优化,多线程环境下无法保证可见性,行为和普通的非volatile字段一致。
内容的提问来源于stack exchange,提问作者user3163495
相关产品推荐
相关产品推荐

