適用場景
總結每次獲取資料的時候,都會擔心資料被修改,所以每次獲取資料的時候都會進行加 鎖,確保在自己使用的過程中資料不會被別人修改,使用完成後進行資料解鎖。由於資料進行加鎖,期間對該資料進行讀寫的其他執行緒都會進行等待。
每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖,但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可以被其他執行緒進行讀寫操作。
比較適合寫入操作比較頻繁的場景,如果出現大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。
比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,資料發生衝突的可能性就會增大,為了保證資料的一致性,應用層需要不斷的重新獲取資料,這樣會增加大量的查詢操作,降低了系統的吞吐量。
兩種鎖各有優缺點,讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖。
Java的悲觀鎖與樂觀鎖
但是,由於在程序掛起和恢復執行過程中存在著很大的開銷。當乙個執行緒正在等待鎖時,它不能做任何事,所以悲觀鎖有很大的缺點。舉個例子,如果乙個執行緒需要某個資源,但是這個資源的占用時間很短,當執行緒第一次搶占這個資源時,可能這個資源被占用,如果此時掛起這個執行緒,可能立刻就發現資源可用,然後又需要花費很...
樂觀鎖與悲觀鎖的區別
在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 l 丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。l 髒讀 當乙個事務讀取其它完成...
樂觀鎖與悲觀鎖的區別
悲觀鎖總是假設最壞的的情況,認為每次訪問共享資源的時候都會被別人修改去加鎖,等鎖釋放後其他執行緒或者程序才能訪問共享資源。共享資源只給乙個執行緒用,其他執行緒只能等待該執行緒把鎖才能訪問共享資源 樂觀鎖總是假設最好的情況,認為每次訪問共享資源的時候都不會有人修改不加鎖,但是在更新時會去判斷在此期間有...