您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“java讀寫鎖ReadWriteLock怎么實(shí)現(xiàn)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“java讀寫鎖ReadWriteLock怎么實(shí)現(xiàn)”吧!
讀寫鎖就是分了兩種情況,一種是讀時(shí)的鎖,一種是寫時(shí)的鎖,它允許多個(gè)線程同時(shí)讀共享變量,但是只允許一個(gè)線程寫共享變量,當(dāng)寫共享變量的時(shí)候也會(huì)阻塞讀的操作。這樣在讀的時(shí)候就不會(huì)互斥,提高讀的效率。
可重入鎖指的是在同一個(gè)線程內(nèi)如果你的外層函數(shù)已經(jīng)獲得了鎖,那么當(dāng)你的內(nèi)層函數(shù)也能獲取鎖,也就是通過(guò)一個(gè)線程再次進(jìn)入同步代碼塊時(shí)可以獲得自己已經(jīng)獲得的鎖,而不可重入則反之。看下簡(jiǎn)單的示例
可重入鎖這樣使用上面代碼是沒(méi)問(wèn)題的,如果不可重入鎖這樣的調(diào)用是不允許的。
來(lái)看看Javadoc中ReentrantReadWriteLock的示例,主要說(shuō)的就是處理一個(gè)獲取一個(gè)緩存數(shù)據(jù)的示例
可以看出使用還是簡(jiǎn)單的,相對(duì)于ReentrantLock來(lái)說(shuō)就是多了個(gè)角色區(qū)別一個(gè)是讀鎖一個(gè)是寫鎖。
上面代碼有提到
Must release read lock before acquiring write lock (在獲取寫鎖前必須釋放讀鎖)
也就是說(shuō)讀寫鎖不允許鎖的升級(jí),不能直接從讀鎖升級(jí)到寫鎖。如果讀鎖還沒(méi)有釋放,此時(shí)獲取寫鎖,會(huì)導(dǎo)致寫鎖永久等待,最終導(dǎo)致相關(guān)線程都阻塞,GG。切記不可這樣使用。
但是鎖的降級(jí)是允許的
Downgrade by acquiring read lock before releasing write lock(通過(guò)在釋放寫鎖之前獲取讀鎖來(lái)降級(jí))
也就是說(shuō)在釋放寫鎖之前可以獲取讀鎖來(lái)達(dá)到鎖的降級(jí)!
讀寫鎖還有一點(diǎn)不同就是寫鎖是支持條件變量的也就是支持newCondition。
而讀鎖是不支持條件變量的,如果讀鎖調(diào)用newCondition會(huì)拋UnsupportedOperationException。
讀寫鎖實(shí)現(xiàn)了java.util.concurrent.locks.Lock接口,所以tryLock()、lockInterruptibly()等方法都是支持的。
并且也支持公平鎖和非公平鎖的模式,底層是也是基于AbstractQueuedSynchronizer實(shí)現(xiàn)的
到此,相信大家對(duì)“java讀寫鎖ReadWriteLock怎么實(shí)現(xiàn)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。