ReentrantReadWriteLock用法

介紹

ReentrantLock是互斥排他鎖佑淀,同一時間只能有一個線程在執(zhí)行任務,ReentrantLock支持鎖的重入功能捧颅,雖然保證了線程的安全性亮蒋,但是效率不高贮尖,實際上應該是寫操作互斥,讀操作共享任连。而jdk提供了讀寫鎖ReentrantReadWriteLock裁着。

讀讀共享

public class MyTask {

    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    
    public void read() {
        try {
            lock.readLock().lock();
            System.out.println(Thread.currentThread().getName() + " start");
            Thread.sleep(10000);
            System.out.println(Thread.currentThread().getName() + " end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.readLock().unlock();
        }
    }
}

public class ReadReadTest {

    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.read();
            }
        });
        t1.setName("t1");
        
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.read();
            }
        });
        t2.setName("t2");
        
        t1.start();
        t2.start();
    }
}

結果:

t2 start
t1 start
t1 end
t2 end

寫寫互斥

public class MyTask {

    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    
    public void write() {
        try {
            lock.writeLock().lock();
            System.out.println(Thread.currentThread().getName() + " start");
            Thread.sleep(10000);
            System.out.println(Thread.currentThread().getName() + " end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.writeLock().unlock();
        }
    }
}

public class ReadReadTest {

    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.write();
            }
        });
        t1.setName("t1");
        
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.write();
            }
        });
        t2.setName("t2");
        
        t1.start();
        t2.start();
    }
}

結果:

t1 start
t1 end
t2 start
t2 end

讀寫互斥

public class MyTask {

    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    
    public void read() {
        try {
            lock.readLock().lock();
            System.out.println(Thread.currentThread().getName() + " start");
            Thread.sleep(10000);
            System.out.println(Thread.currentThread().getName() + " end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.readLock().unlock();
        }
    }
    
    public void write() {
        try {
            lock.writeLock().lock();
            System.out.println(Thread.currentThread().getName() + " start");
            Thread.sleep(10000);
            System.out.println(Thread.currentThread().getName() + " end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.writeLock().unlock();
        }
    }
}

public class ReadReadTest {

    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.read();
            }
        });
        t1.setName("t1");
        
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.write();
            }
        });
        t2.setName("t2");
        
        t1.start();
        
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        t2.start();
    }
}

結果:

t1 start
t1 end
t2 start
t2 end

寫讀互斥

public class ReadReadTest {

    public static void main(String[] args) {
        final MyTask myTask = new MyTask();
        
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.write();
            }
        });
        t1.setName("t1");
        
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                myTask.read();
            }
        });
        t2.setName("t2");
        
        t1.start();
        
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        t2.start();
    }
}

結果:

t1 start
t1 end
t2 start
t2 end

總結

讀操作的鎖叫共享鎖拱她,寫操作的鎖叫排他鎖二驰。就是遇見寫鎖就需互斥。那么以此可得出讀讀共享秉沼,寫寫互斥桶雀,讀寫互斥矿酵,寫讀互斥。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末矗积,一起剝皮案震驚了整個濱河市全肮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棘捣,老刑警劉巖辜腺,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乍恐,居然都是意外死亡评疗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門茵烈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來百匆,“玉大人,你說我怎么就攤上這事呜投〖有伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵宙彪,是天一觀的道長矩动。 經(jīng)常有香客問我,道長释漆,這世上最難降的妖魔是什么悲没? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮男图,結果婚禮上示姿,老公的妹妹穿的比我還像新娘。我一直安慰自己逊笆,他們只是感情好栈戳,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著难裆,像睡著了一般子檀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乃戈,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天褂痰,我揣著相機與錄音,去河邊找鬼症虑。 笑死缩歪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的谍憔。 我是一名探鬼主播匪蝙,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼主籍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逛球?” 一聲冷哼從身側響起千元,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎需忿,沒想到半個月后诅炉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屋厘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了月而。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汗洒。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖父款,靈堂內的尸體忽然破棺而出溢谤,到底是詐尸還是另有隱情,我是刑警寧澤憨攒,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布世杀,位于F島的核電站,受9級特大地震影響肝集,放射性物質發(fā)生泄漏瞻坝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一杏瞻、第九天 我趴在偏房一處隱蔽的房頂上張望所刀。 院中可真熱鬧,春花似錦捞挥、人聲如沸浮创。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斩披。三九已至,卻和暖如春讹俊,著一層夾襖步出監(jiān)牢的瞬間垦沉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工劣像, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乡话,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓耳奕,卻偏偏與公主長得像绑青,于是被迫代替她去往敵國和親诬像。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容

  • 本文是我自己在秋招復習時的讀書筆記闸婴,整理的知識點坏挠,也是為了防止忘記,尊重勞動成果邪乍,轉載注明出處哦降狠!如果你也喜歡,那...
    波波波先森閱讀 11,243評論 4 56
  • 理解鎖的基礎知識 如果想要透徹的理解java鎖的來龍去脈睛驳,需要先了解以下基礎知識烙心。 基礎知識之一:鎖的類型 公平鎖...
    SithCait閱讀 3,788評論 5 101
  • 線程安全 當多個線程訪問一個對象時,如果不用考慮這些線程在運行時環(huán)境下的調度和交替執(zhí)行乏沸,也不需要進行額外的同步淫茵,或...
    閩越布衣閱讀 760評論 0 6
  • 一炬转、Json Json介紹 JSON是一種輕量級的數(shù)據(jù)格式辆苔,一般用于數(shù)據(jù)交互 服務器返回給客戶端的數(shù)據(jù),一般都是J...
    伶俐ll閱讀 1,378評論 0 1
  • 昨天中午扼劈,倩倩驻啤,娜娜和我,一起午飯荐吵,中間談到娜娜在助教班回來的一個改變:她可以看到我了骑冗。 她這樣說,我的內心頗有漣...
    乙辛閱讀 492評論 2 2