您好,登錄后才能下訂單哦!
本篇內容介紹了“數據中的鎖有哪些類型”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
悲觀鎖指對數據被外界修改持保守態度,認為數據很容易就會被其他線程修改,所以在數據被處理前先對數據進行加鎖, 并在整個數據處理過程中,使數據處于鎖定狀態。 悲觀鎖主要分為共享鎖和排他鎖 1. 共享鎖【Shared lock】又稱為讀鎖,簡稱S鎖。顧名思義,共享鎖就是多個事務對于同一數據可以共享一把鎖, 都能訪問到數據,但是只能讀不能修改。 2. 排他鎖【Exclusive lock】又稱為寫鎖,簡稱X鎖。顧名思義,排他鎖就是不能與其他鎖并存, 如果一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖, 但是獲取排他鎖的事務是可以對數據行讀取和修改。 例如:java中的synchronized關鍵字、接口Lock的實現類、mysql的select...for update等
樂觀鎖是相對悲觀鎖來說的,它認為數據在一般情況下不會造成沖突,所以在訪問記錄前不會加排它鎖, 而是在進行數據提交更新時,才會正式對數據沖突與否進行檢測。 例如:使用數據版本(Version++)記錄機制實現、使用時間戳、java中Atomic的CAS等
公平鎖表示線程獲取鎖的順序是按照線程請求鎖的時間早晚來決定的,也就是最早請求鎖的線程將最早獲取到鎖 例如:ReentrantLock pairLock = new ReentrantLock(true);
非公平鎖表示線程獲取鎖的順序不一定是先到先得。 例如:ReentrantLock unpairLock = new ReentrantLock(false)。如果構造函數不傳遞參數,則默認是非公平鎖。
獨占鎖是任何時候都只有一個線程能得到鎖。 例如:Java的ReentrantLock
共享鎖是可以同時由多個線程持有,它允許一個資源可以被多線程同時進行讀操作。 例如:ReentrantReadWriteLock的讀鎖
可重入鎖又名遞歸鎖,是指在同一個線程在外層方法獲取鎖的時候,在進入內層方法會自動獲取鎖。原理是在鎖內部維護一個線程標示,用來標示該鎖目前被哪個線程占用,然后關聯一個計數器。一開始計數器值為0,說明該鎖沒有被任何線程占用。當一個線程獲取了該鎖時,計數器的值會變成1,這時其他線程再來獲取該鎖時會發現鎖的所有者不是自己而被阻塞掛起。 例如: public sychrnozied void test() { xxxxxx; test2(); } public sychronized void test2() { yyyyy; }
自旋鎖是線程獲取鎖的時候,如果鎖被其他線程持有,則當前線程將循環等待,直到獲取到鎖。
“數據中的鎖有哪些類型”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。