什麼是競態條件?舉例說明

2022-08-16 02:39:15 字數 450 閱讀 7473

當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。

導致競態條件發生的**區稱作臨界區。

在臨界區中使用適當的同步就可以避免競態條件。

臨界區實現方法有兩種,一種是用synchronized,一種是用lock顯式鎖實現。

eg 來自**:

class counter   

}

觀察執行緒a和b交錯執行會發生什麼,兩個執行緒分別加了2和3到count變數上,兩個執行緒執行結束後count變數的值應該等於5。然而由於兩個執行緒是交叉執行的,兩個執行緒從記憶體中讀出的初始值都是0。然後各自加了2和3,並分別寫回記憶體。最終的值並不是期望的5,而是最後寫回記憶體的那個執行緒的值,上面例子中最後寫回記憶體的是執行緒a,但實際中也可能是執行緒b。如果沒有採用合適的同步機制,執行緒間的交叉執**況就無法預料。

add()方法就是乙個臨界區,它會產生競態條件。

什麼是競態條件

1 什麼是競態條件?當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的 區稱作臨界區。在臨界區中使用適當的同步就可以避免競態條件。臨界區實現方法有兩種,一種是用synchronized,一種是用lock顯式鎖實現。2 例項 class counter 觀察執行...

什麼是拆箱和裝箱 舉例說明

1.裝箱,值型別向引用型別轉換 在託管堆中分配記憶體,分配的記憶體量是型別各字段所需的記憶體量 型別物件指標所需的記憶體量 同步塊索引所需的記憶體量。值型別的字段複製到分配好的記憶體中 返回物件位址,現在物件位址是物件引用 2.拆箱,引用型別向值型別轉換 獲取已裝箱型別中的未裝箱部分,也就是物件的原...

js 舉例說明js中什麼是尾呼叫優化

寫在前面 上次介紹了什麼是尾呼叫以及怎麼準確快速的判別乙個函式呼叫是否為尾呼叫。那麼,我們判別尾呼叫的意義是什麼呢?做什麼事情總歸有個目的,那麼今天我們就來系統的介紹一下尾呼叫的意義,或者說尾呼叫有什麼用吧。2.尾呼叫優化 我們知道,函式的呼叫會在記憶體中生成乙個 呼叫幀 call frame 儲存...