volatile应该与(非并发)集合一起使用吗
本文关键字:一起 集合 并发 volatile | 更新日期: 2023-09-27 18:00:36
我熟悉volatile
的基本思想(总之,为了防止编译器优化涉及可能从多个线程访问的值的指令),但我注意到,我发现的涉及volatile
和.NET 3.5集合的示例(不是.NET 4 Concurrent
集合。我知道它们是什么,但我当前的上下文不允许我使用.NET 4。)从未将volatile
应用于集合本身。当然,当从多个线程访问集合时,需要锁定该集合(或相应的锁定object
),但是否有理由不将集合标记为volatile
?集合的类型是否重要(即值类型的List
与引用类型的List
)?
几乎可以肯定,Volatile并不是你认为的那样。这就是不使用它的主要原因。(现在我拒绝尝试描述volatile的含义。它太复杂了,无法巧妙地解释,而且它几乎总是错误的方法,除非你是内存模型专家,在这种情况下,你绝对不需要me来向你解释。)
如果你锁定了一个合适的对象,你认为它会给你带来什么好处?在获取和释放锁的过程中,你已经经历了适当的记忆障碍。。。我怀疑使用volatile
作为变量本身的任何原因都是基于误解。
除非您实际上正在更改集合的引用(即,将新集合重复分配给引用集合的变量),否则没有理由将该变量标记为volatile
(即,它没有按照您认为的那样做)。
即使你是(然后我会质疑你在做什么???),如果你的lock
工作正常,你是否需要volatile
也不清楚。
顺便说一句,这门课真的很难。真的,真的,很难。
如果不更改引用(即创建一个全新的不相关集合并替换字段中的集合),则volatile
将不会执行任何操作。就我个人而言,在线程密集型的情况下,我可能会将集合字段readonly
设置为,只是为了防止意外(并使用lock
)。
所以很可能:没有。
您只需要使用一个锁。在你所描述的内容中没有对volatile
的要求。
如果通过volatile标记集合,则只标记引用本身,而不是整个集合。