我熟悉volatile
的基本思想(为了防止编译器优化涉及可以从多个线程访问的值的指令,总结),但我注意到我发现涉及的例子volatile
和.NET 3.5集合(非.NET 4 Concurrent
集合。我知道它们是什么,但我当前的上下文不允许我使用.NET 4.)从未应用volatile
集合本身。当然,从多个线程访问集合时,需要锁定集合(或相应的锁定object
),但有没有理由不将集合标记为volatile
?集合类型是否重要(即List
值类型与List
引用类型相比)?
答案 0 :(得分:7)
Volatile almost certainly doesn't mean what you think it does.这是不使用它的主要原因。 (这些天我拒绝尝试描述易失性的含义。它太复杂而不能整齐地解释,除非你是一个记忆模型专家,否则几乎总是错误的做法,在这种情况下你肯定不需要 me < / em>向你解释。)
如果你锁定了一个合适的物体,你认为它会带给你什么好处?在获取和释放锁时,你已经准备好通过适当的内存栅栏......我怀疑使用volatile
变量本身的任何原因都是基于误解。
答案 1 :(得分:3)
如果您不更改引用(即创建一个全新的无关集合并在字段中替换它),则volatile
将不执行任何操作。就个人而言,我可能会在线程密集的案例中创建集合字段readonly
,以防止意外(并使用lock
)。
所以可能:不。
答案 2 :(得分:3)
除非您实际更改集合的引用(即,重复将新集合分配给引用集合的变量),否则没有理由将该变量标记为volatile
(也就是说,它不是做你认为它做的事情。)
即使你是(然后我会质疑你在做什么?),如果你volatile
正确的话,你还不清楚是否需要lock
。
顺便说一句,这个主题真的很难。真的,真的,真的很难。
答案 3 :(得分:1)
你只需要使用锁。在你描述的内容中没有volatile
的号召。
答案 4 :(得分:0)
如果您通过volatile标记集合,则只需标记引用本身,而不是整个集合。