悲觀鎖:
總是假設發生最壞的情況,就是每次去拿資料的時候都認為別人會修改
,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖(共享資源每次只給乙個執行緒使用,其它執行緒阻塞,用完後再把資源轉讓給其它執行緒)。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。synchronized
和``reentrantlock`等獨佔鎖就是悲觀鎖思想的實現。
樂觀鎖的實現方式
樂觀鎖一般會使用版本號機制或cas 演算法實現。
版本號機制
一般是在資料表中加上乙個資料版本號 version 字段,表示資料被修改的次數,當資料被修改時,version 值會加一。當執行緒a 要更新資料值時,在讀取資料的同時也會讀取 version 值,在提交更新時,若剛才讀取到的version 值為當前資料庫中的 version 值相等時才更新,否則重試更新操作,直到更新成功。cas 演算法
即 compare and swap(比較與交換),是一種有名的無鎖演算法。無鎖程式設計,即不使用鎖的情況下實現多執行緒之間的變數同步,也就是在沒有執行緒被阻塞的情況下實現變數的同步,所以也叫非阻塞同步(non-blocking synchronization)
使用場景
迴圈時間長開銷大
只能保證乙個共享變數的原子操作
一般多寫的場景下用悲觀鎖就比較合適。
cas 與synchronized 的使用情景
cas 適用於寫比較少的情況下(多讀場景,衝突一般較少) synchronized 適用於寫比較多的情況下(多寫場景,衝突一般較多)
樂觀鎖與悲觀鎖 理解
當我們要對乙個資料庫中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是直接對該資料進行加鎖以防止併發,這種借助資料庫鎖機制在修改資料之前先鎖定,再修改的方式被稱之為悲觀併發控制。悲觀鎖,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度 悲觀...
樂觀鎖與悲觀鎖的理解
不管是悲觀鎖還是樂觀鎖,主要作用就是對共享資源上鎖,防止多執行緒訪問產生的執行緒安全問題。鎖處理的是修改資料問題 更新資料問題 悲觀鎖 假設資料修改一定會出現執行緒安全問題,訪問時申請對資源的鎖,其他使用者只能阻塞等待。樂觀鎖 假設資料修改一般不會出現衝突,只有在資料提交的時候才會對資料衝突與否進行...
深度理解樂觀鎖與悲觀鎖
public int updateentry long id for update id 2 修改記錄內容,根據計算修改entry記錄的屬性 string name generatorname entry entry.setname name 3 update操作 int count update ...