首先直接上**:(下面是一段servlet**)
public
long
getcount()
public
void
service(servletrequest req , servletresponse resp)
上面這個**是為了統計有多個次訪問了servlet。但是該類是執行緒不安全的,因為++count看上去只是乙個操作,其實是分三步的:讀取-修改-寫入 ,並且結果狀態依賴於之前的狀態。所以,當兩個執行緒a和b同時讀取到了count的值,那麼接下來a修改count後,b的值已經是a修改前讀到的值,所以此時的資料就會不準確。這也就是競態條件。
**靜態條件:當某個計算的正確性取決於多個執行緒的交替執行時,那麼就會出現靜態條件。**
public
class lazyinitrace
return demo;
}}
上面這段**也是執行緒不安全的。例如a和b兩個執行緒同時訪問這個**就會出現讀取錯誤。例如a執行緒進入了getdemo方法,判斷了demo==null,而恰巧此時b執行緒也到了這一步,所以此時就會建立兩個demo物件。這就出現了執行緒不安全的現象。
上面使用的是延遲初始化靜態條件,就是先判斷demo是否已經被初始化,然後再初始化。由於缺少原子性操作,所以,執行緒是不安全的。
所以我麼應該對這個**進行原子性操作。也就是對demo所有的操作封裝成乙個原子,也就是只能被乙個執行緒同時訪問。
**所謂原子操作是指,對於訪問同一狀態的所有操作(包括操作本身)來說,這個操作是乙個以原子方式執行的操作**
而這段**想要實現執行緒安全其實加乙個synchronized就行了。如下:
public
synchronized demo getdemo()
return demo;
}
12 競態條件 時序競態
sleep函式幾點說明 1 sleep函式作用,讓程序睡眠。2 能被訊號打斷,然後處理訊號函式以後,就不再睡眠了。直接向下執行 3 sleep函式的返回值,是剩餘的秒數 sleep是可被中斷的睡眠,但不一定睡夠100s sleep是可中斷的睡眠 void handler int num if 1 v...
什麼是競態條件
1 什麼是競態條件?當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的 區稱作臨界區。在臨界區中使用適當的同步就可以避免競態條件。臨界區實現方法有兩種,一種是用synchronized,一種是用lock顯式鎖實現。2 例項 class counter 觀察執行...
原子操作以及加鎖機制
一 原子操作 不可被中斷的乙個或一系列操作。二 處理器如何實現原子操作 32位處理器使用基於對快取加鎖或匯流排加鎖的方式來實現多處理器之間的原子操作 1 匯流排鎖 使用處理器提供乙個lock 訊號,當乙個處理器在匯流排上輸出此訊號的時候,其他處理器的請求將被阻塞,那麼該處理器可以獨佔使用共享記憶體。...