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中文網其他相關文章!