讀寫鎖 ReadWriteLock

RelaxHeart網(wǎng) - Tec博客: 我的更多文章

ReadWriteLock


ReadWriteLock是JDK5中提供的讀寫分離鎖多艇。讀寫分離鎖可以有效地幫助減少鎖競爭狡逢,以提高系統(tǒng)性能患蹂。用鎖分離的機(jī)制來提升性能非常容易理解荤懂,比如線程A1,A2,A3進(jìn)行寫操作箍镜,B1,B2,B3進(jìn)行讀操作配椭,如果使用重入鎖或者內(nèi)部鎖(synchronized)則論路上說所有讀之間内舟、讀與寫之間匿乃、寫與寫之間都是穿行操作的桩皿。當(dāng)B1進(jìn)行讀取時(shí),B2幢炸、B3則需要等待鎖泄隔。由于讀操作并不對(duì)數(shù)據(jù)的完整性造成破壞,這種等待顯然是不合理的宛徊。因此佛嬉,讀寫鎖就有了發(fā)揮功能的余地。

在這種情況下闸天,讀寫鎖允許多個(gè)線程同時(shí)讀巷燥,使得B1,B2,B3之間真正并行。但是号枕,考慮都數(shù)據(jù)完整性缰揪,寫寫操作和讀寫操作間依然時(shí)需要相互等待和持有鎖的〈写荆總的來說钝腺,讀寫鎖的訪問約束如下表:

image.png

使用示例


如果在系統(tǒng)中,讀操作次數(shù)遠(yuǎn)遠(yuǎn)大于寫操作赞厕,則讀寫鎖就可以發(fā)揮最大的功效艳狐,提升系統(tǒng)的性能。這里我給出一個(gè)稍微夸張點(diǎn)的案例皿桑,來說明讀寫鎖對(duì)性能的幫助:

/**
 * @Author: 王琦 <QQ.Eamil>1124602935@qq.com</QQ.Eamil>
 * @Date: 2019-5-4 0004 9:17
 * @Description: 讀寫鎖案例
 */
public class ReadWriteLockDemo {

    private static Lock lock = new ReentrantLock();
    private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    private static Lock readLock = readWriteLock.readLock();
    private static Lock writeLock = readWriteLock.writeLock();
    private int val;

    /**
     * 處理讀操作
     *
     * @throws InterruptedException
     */
    public Object handleRead(Lock lock) throws InterruptedException {
        try {
            // 模擬讀操作
            lock.lock();
            // 讀操作的耗時(shí)越多毫目,讀寫鎖的性能優(yōu)勢就越明顯
            Thread.sleep(1000);
            return val;
        } finally {
            lock.unlock();
        }
    }

    /**
     * 處理寫操作
     *
     * @throws InterruptedException
     */
    public void handleWrite(Lock lock, int index) throws InterruptedException {
        try {
            // 模擬寫操作
            lock.lock();
            Thread.sleep(1000);
            val = index;
        } finally {
            lock.unlock();
        }
    }


    public static void main(String[] args) {
        final ReadWriteLockDemo demo = new ReadWriteLockDemo();
        Runnable readRunnale = new Runnable() {
            @Override
            public void run() {
                try {
                    demo.handleRead(readLock);
                    demo.handleRead(lock);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        Runnable writeRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    demo.handleWrite(writeLock, new Random().nextInt());
                    demo.handleWrite(lock, new Random().nextInt());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        for (int i=0; i<18; i++){
            new Thread(readRunnale).start();
        }

        for (int i=0; i<2; i++){
            new Thread(writeRunnable).start();
        }
    }
}

總結(jié)


對(duì)于讀寫鎖訪問約束如下:
(1)讀-讀不互斥:讀讀之間不阻塞
(2)讀-寫互斥:讀阻塞寫蔬啡,寫也會(huì)阻塞讀
(3)寫-寫互斥:寫寫阻塞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市镀虐,隨后出現(xiàn)的幾起案子箱蟆,更是在濱河造成了極大的恐慌,老刑警劉巖刮便,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件空猜,死亡現(xiàn)場離奇詭異,居然都是意外死亡恨旱,警方通過查閱死者的電腦和手機(jī)辈毯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搜贤,“玉大人谆沃,你說我怎么就攤上這事∫敲ⅲ” “怎么了管毙?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桌硫。 經(jīng)常有香客問我夭咬,道長,這世上最難降的妖魔是什么铆隘? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任卓舵,我火速辦了婚禮,結(jié)果婚禮上膀钠,老公的妹妹穿的比我還像新娘掏湾。我一直安慰自己,他們只是感情好肿嘲,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布融击。 她就那樣靜靜地躺著凑兰,像睡著了一般偿警。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上城看,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天封救,我揣著相機(jī)與錄音拇涤,去河邊找鬼。 笑死誉结,一個(gè)胖子當(dāng)著我的面吹牛鹅士,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惩坑,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼掉盅,長吁一口氣:“原來是場噩夢啊……” “哼也拜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趾痘,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤慢哈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扼脐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奋刽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年瓦侮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佣谐。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肚吏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狭魂,到底是詐尸還是另有隱情罚攀,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布雌澄,位于F島的核電站斋泄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏镐牺。R本人自食惡果不足惜炫掐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睬涧。 院中可真熱鬧募胃,春花似錦、人聲如沸畦浓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讶请。三九已至祷嘶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夺溢,已是汗流浹背抹蚀。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留企垦,地道東北人环壤。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像钞诡,于是被迫代替她去往敵國和親郑现。 傳聞我的和親對(duì)象是個(gè)殘疾皇子湃崩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容