Java多執行緒的悲觀鎖與樂觀鎖及各自適用場景

2021-08-18 07:09:06 字數 508 閱讀 6133

悲觀鎖,就是不管是否發生多執行緒衝突,只要存在這種可能,就每次訪問都加鎖,加鎖就會導致鎖之間的爭奪,有爭奪就會有輸贏,輸者等待。

syncrhoized是一種獨佔鎖,即:占用該鎖的執行緒才可以執行,申請該鎖的執行緒就只能掛起等待,直到占用鎖的執行緒釋放鎖才喚醒,拿到鎖並執行。由於在程序掛起和恢復執行過程中存在著很大的開銷,並且當乙個執行緒正在等待鎖時,它不能做任何事。所以

syncrhoized是一種悲觀鎖

,凡是用syncrhoized加了鎖的多執行緒之間都會因鎖的爭奪結果導致掛起、喚醒等開銷。

獲得鎖後一直持有鎖以防本執行緒再次申請該鎖造成無謂的解鎖再加鎖開銷,或者假設沒有衝突而去完成同步**塊如果衝突再迴圈重試,或者採取申請鎖失敗後不立刻掛起而是稍微等待再次嘗試獲取 等待策略,以減少執行緒因為掛起、阻塞、喚醒(發生cpu的排程切換) 而造成的開銷。

偏向鎖、輕量級鎖(cas輪詢)、自旋鎖 就是基於上述思路的樂觀鎖

在多執行緒的加鎖機制中,jvm會首先嘗試樂觀鎖,失敗後才呼叫悲觀鎖。

Java多執行緒 樂觀鎖 悲觀鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...

Java的悲觀鎖與樂觀鎖

但是,由於在程序掛起和恢復執行過程中存在著很大的開銷。當乙個執行緒正在等待鎖時,它不能做任何事,所以悲觀鎖有很大的缺點。舉個例子,如果乙個執行緒需要某個資源,但是這個資源的占用時間很短,當執行緒第一次搶占這個資源時,可能這個資源被占用,如果此時掛起這個執行緒,可能立刻就發現資源可用,然後又需要花費很...

悲觀鎖與樂觀鎖

悲觀鎖與樂觀鎖 悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗 了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次一 個事務讀取某一條記錄後,就會把這條記...