Interlocked
操作、lock
语句和 volatile
字段的比较
问题:
假设一个类包含一个公共 int
类型的计数器字段,该字段被多个线程访问,并且仅对其进行增量或减量操作。哪种方法是增量此字段的最佳方法,为什么?
lock(this.locker) this.counter ;
Interlocked.Increment(ref this.counter);
public volatile
。答案:
最差(不可行):
public volatile
仅使用 volatile
字段不能保证线程安全。虽然 volatile
确保多个 CPU 同时访问相同的数据,但它不能防止读取和写入操作的交错,这可能导致错误。
次优:
lock(this.locker) this.counter ;
lock
语句通过防止其他线程执行修改受保护字段的代码来提供线程安全。但是,锁定相对较慢,并且可能不必要地阻塞其他线程。
最佳:
Interlocked.Increment(ref this.counter);
Interlocked
操作是原子且线程安全的,为修改共享数据提供了最有效和可靠的方法。它们以一次性操作执行读取、增量和写入操作,无需锁定。
Interlocked
操作与 volatile
字段的比较:
Interlocked
操作在执行的指令周围应用完整的栅栏,防止多个 CPU 重新排序。volatile
字段仅在其操作周围放置半栅栏,因此它们不会防止重新排序。因此,对于共享数据的并发修改,应使用 Interlocked
操作;而对于写入器从不读取且读取器从不写入原子值的场景,volatile
字段则适用。
以上是跨多个线程递增共享整数计数器的最佳方法是:'lock”、'Interlocked”还是'易失性”?的详细内容。更多信息请关注PHP中文网其他相关文章!