我目前正在閱讀Joe Albahari的Threading in C#電子書,有時在他的示例代碼中,他在沒有看到任何線程安全問題的地方使用鎖。例如,他鎖定寫入_status字段並從中讀取_status字段,該字段指的是不可變對象。爲什麼在這裏使用鎖?
我明白,如果ProgressStatus類是可變,你就需要鎖定圍繞讀取和寫入到它,因爲如果一個線程是捷足先登被另一個線程讀取更新PERCENTCOMPLETE和StatusMessage場之間狀態,第二個線程可能會爲這些字段獲取一對無效值。 (100%完成/「操作正在進行中......」)
但由於ProgressStatus是不變的,不會發生這樣的無效狀態。如果Joe刪除了這兩個鎖,那麼會出現什麼線程安全問題?
謝謝 - 我懷疑一個易變的字段可能會訣竅。 「'volatile'也有問題」 - 你能否詳細說明一下? – dgmulf