本篇內(nèi)容介紹了“數(shù)據(jù)中的鎖有哪些類型”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的防城港網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
悲觀鎖指對數(shù)據(jù)被外界修改持保守態(tài)度,認(rèn)為數(shù)據(jù)很容易就會被其他線程修改,所以在數(shù)據(jù)被處理前先對數(shù)據(jù)進(jìn)行加鎖, 并在整個數(shù)據(jù)處理過程中,使數(shù)據(jù)處于鎖定狀態(tài)。 悲觀鎖主要分為共享鎖和排他鎖 1. 共享鎖【Shared lock】又稱為讀鎖,簡稱S鎖。顧名思義,共享鎖就是多個事務(wù)對于同一數(shù)據(jù)可以共享一把鎖, 都能訪問到數(shù)據(jù),但是只能讀不能修改。 2. 排他鎖【Exclusive lock】又稱為寫鎖,簡稱X鎖。顧名思義,排他鎖就是不能與其他鎖并存, 如果一個事務(wù)獲取了一個數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖,包括共享鎖和排他鎖, 但是獲取排他鎖的事務(wù)是可以對數(shù)據(jù)行讀取和修改。 例如:java中的synchronized關(guān)鍵字、接口Lock的實現(xiàn)類、MySQL的select...for update等
樂觀鎖是相對悲觀鎖來說的,它認(rèn)為數(shù)據(jù)在一般情況下不會造成沖突,所以在訪問記錄前不會加排它鎖, 而是在進(jìn)行數(shù)據(jù)提交更新時,才會正式對數(shù)據(jù)沖突與否進(jìn)行檢測。 例如:使用數(shù)據(jù)版本(Version++)記錄機制實現(xiàn)、使用時間戳、java中Atomic的CAS等
公平鎖表示線程獲取鎖的順序是按照線程請求鎖的時間早晚來決定的,也就是最早請求鎖的線程將最早獲取到鎖 例如:ReentrantLock pairLock = new ReentrantLock(true);
非公平鎖表示線程獲取鎖的順序不一定是先到先得。 例如:ReentrantLock unpairLock = new ReentrantLock(false)。如果構(gòu)造函數(shù)不傳遞參數(shù),則默認(rèn)是非公平鎖。
獨占鎖是任何時候都只有一個線程能得到鎖。 例如:Java的ReentrantLock
共享鎖是可以同時由多個線程持有,它允許一個資源可以被多線程同時進(jìn)行讀操作。 例如:ReentrantReadWriteLock的讀鎖
可重入鎖又名遞歸鎖,是指在同一個線程在外層方法獲取鎖的時候,在進(jìn)入內(nèi)層方法會自動獲取鎖。原理是在鎖內(nèi)部維護一個線程標(biāo)示,用來標(biāo)示該鎖目前被哪個線程占用,然后關(guān)聯(lián)一個計數(shù)器。一開始計數(shù)器值為0,說明該鎖沒有被任何線程占用。當(dāng)一個線程獲取了該鎖時,計數(shù)器的值會變成1,這時其他線程再來獲取該鎖時會發(fā)現(xiàn)鎖的所有者不是自己而被阻塞掛起。 例如: public sychrnozied void test() { xxxxxx; test2(); } public sychronized void test2() { yyyyy; }
自旋鎖是線程獲取鎖的時候,如果鎖被其他線程持有,則當(dāng)前線程將循環(huán)等待,直到獲取到鎖。
“數(shù)據(jù)中的鎖有哪些類型”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!