該文章原創,**
i++的執行緒安全性可以總結如下:
(1)如果i是區域性變數,那麼是可重入的,也就是執行緒安全的。
(2)如果i是全域性變數,則同一程序的不同執行緒都可能訪問到該變數,因而是執行緒不安全的。
上面這兩點比較清晰,具體原因我將在下面解釋:
本質上來講,i並不是因為是全域性變數才說是執行緒不安全的。其實其本質原因是i++這個操作並不是原子的,如果這是原子操作的話,具有不可分特性,那麼即便是所有執行緒都能訪問到,也都是執行緒安全的。
i++最終被編譯後的反彙編**大概如下:
mov eax,【******xx】
inc eax
一條c語句已經被分為兩條操作指令,那麼在這兩條操作指令執行之間,可能由於中斷而被排程到不同執行緒,於是,不安全性就產生了。當然了,這並不是說單條彙編語句就是執行緒安全的,這取決於cpu架構,因為單條彙編指令可能在多個cpu時鐘週期內進行,有些cpu架構可以在任何乙個時鐘週期內響應中斷,對於這樣的cpu,就是單條指令都不是安全的。當然了,現在的cpu大部分都是一條指令執行完後才能響應中斷的。想要進行原子操作,方法有很多種,其中一種比較簡單的是在原子語句之間先關閉中斷,然後進行原子操作後再開啟中斷就ok了。
i 的執行緒安全性
i 的執行緒安全性可以總結如下 1 如果i是區域性變數,那麼是可重入的,也就是執行緒安全的。2 如果i是全域性變數,則同一程序的不同執行緒都可能訪問到該變數,因而是執行緒不安全的。上面這兩點比較清晰,具體原因我將在下面解釋 本質上來講,i並不是因為是全域性變數才說是執行緒不安全的。其實其本質原因是i...
執行緒安全性
定義 當多個執行緒訪問某個類時,不管執行環境採用何種呼叫方式或者這些執行緒如何交替執行,並且在主調 中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。主要表現三個方面 atomic cas unsafe.compareandswapint atomiclong...
執行緒安全性
執行緒安全性 當多個執行緒訪問某個類時,這個類始終都能表現出正確的行為,那麼稱這個類是執行緒安全的。執行緒不安全產生的問題 競態條件 由於不恰當的執行時序而出現不正確的結果。大多數競態條件的本質是基於一種可能失效的觀察結果來做出判斷或者執行某個計算。常見先檢查後執行,延遲初始化 單例模式 讀取 修改...