最近,我在一个WebSite中看到了这段代码,我的问题是:

        private bool mbTestFinished = false;

        private bool IsFinished()
        {
            lock( mLock )
            {
                return mbTestFinished;
            }
        }

        internal void SetFinished()
        {
            lock( mLock )
            {
                mbTestFinished = true;
            }
        }

在多线程环境中,是否真的需要锁定对mbTestFinished的访问?

最佳答案

是的,这是必需的。 .Net环境使用了一些优化,有时如果频繁访问内存位置,则数据将移入CPU寄存器。因此,在这种情况下,如果mbTestFinished在CPU寄存器中,则读取它的线程可能会得到错误的值。因此,使用 volatile 键可确保对该变量的所有访问均在存储器位置而不是寄存器中进行。
另一方面,我不知道发生这种情况的频率。这可能会以非常低的频率发生。

09-27 14:14