volatile:
线程用到变量时,会将内存中的变量放到cpu寄存器中,如果其他线程修改了内存中的变量,cpu寄存器中的缓存并不会更新,如果我们给变量加了volatile关键字,程序在执行时,不会将此变量放入寄存器中,而是每次用到都从变量读取,这样的话其他线程在修改了这个变量时,当前线程可以获取最新值。
简单来说volatile关键字是告诉c#编译器和JIT编译器,不对volatile标记的字段做任何的缓存。确保字段读取都是最新值。
public volatile Int32 score1 = 1;
Volatile能保证线程安全吗?
对于volatile修饰的变量,虚拟机只是保证从主内存加载到线程工作内存的值是最新的,修改后修改的是线程栈中的变量,并没有直接保存到内存中,所以不能保证线程安全。(应该使用Interlocked类操作变量)
调用Thread.MemoryBarrier()方法,可以和volatile起到相同的作用,告诉编译器每次读取变量都从内存读取,不要从cpu寄存器读取
原文:https://www.cnblogs.com/fanfan-90/p/12957640.html