欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Synchronized與ReentrantLock有什么區(qū)別

Synchronized與ReentrantLock有什么區(qū)別,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

桃江網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

相似點(diǎn):

這兩種同步方式有很多相似之處,它們都是加鎖方式同步,而且都是阻塞式的同步,也就是說當(dāng)如果一個線程獲得了對象鎖,進(jìn)入了同步塊,其他訪問該同步塊的線程都必須阻塞在同步塊外面等待,而進(jìn)行線程阻塞和喚醒的代價是比較高的(操作系統(tǒng)需要在用戶態(tài)與內(nèi)核態(tài)之間來回切換,代價很高,不過可以通過對鎖優(yōu)化進(jìn)行改善)。

功能區(qū)別:

這兩種方式最大區(qū)別就是對于Synchronized來說,它是java語言的關(guān)鍵字,是原生語法層面的互斥,需要jvm實(shí)現(xiàn)。而ReentrantLock它是JDK 1.5之后提供的API層面的互斥鎖,需要lock()和unlock()方法配合try/finally語句塊來完成

便利性:很明顯Synchronized的使用比較方便簡潔,并且由編譯器去保證鎖的加鎖和釋放,而ReenTrantLock需要手工聲明來加鎖和釋放鎖,為了避免忘記手工釋放鎖造成死鎖,所以最好在finally中聲明釋放鎖。

鎖的細(xì)粒度和靈活度:很明顯ReenTrantLock優(yōu)于Synchronized

性能的區(qū)別:

在Synchronized優(yōu)化以前,synchronized的性能是比ReenTrantLock差很多的,但是自從Synchronized引入了偏向鎖,輕量級鎖(自旋鎖)后,兩者的性能就差不多了,在兩種方法都可用的情況下,官方甚至建議使用synchronized,其實(shí)synchronized的優(yōu)化我感覺就借鑒了ReenTrantLock中的CAS技術(shù)。都是試圖在用戶態(tài)就把加鎖問題解決,避免進(jìn)入內(nèi)核態(tài)的線程阻塞。

1.Synchronized

Synchronized進(jìn)過編譯,會在同步塊的前后分別形成monitorenter和monitorexit這個兩個字節(jié)碼指令。在執(zhí)行monitorenter指令時,首先要嘗試獲取對象鎖。如果這個對象沒被鎖定,或者當(dāng)前線程已經(jīng)擁有了那個對象鎖,把鎖的計算器加1,相應(yīng)的,在執(zhí)行monitorexit指令時會將鎖計算器就減1,當(dāng)計算器為0時,鎖就被釋放了。如果獲取對象鎖失敗,那當(dāng)前線程就要阻塞,直到對象鎖被另一個線程釋放為止。

 
  1.  

    public class SynDemo{    

  2.  

     

  3.  

    public static void main(String[] arg){    

  4.  

    Runnable t1=new MyThread();    

  5.  

    new Thread(t1,"t1").start();    

  6.  

    new Thread(t1,"t2").start();    

  7.  

    }    

  8.  

     

  9.  

    }    

  10.  

    class MyThread implements Runnable {    

  11.  

     

  12.  

    @Override    

  13.  

    public void run() {    

  14.  

    synchronized (this) {    

  15.  

    for(int i=0;i<10;i++)    

  16.  

    System.out.println(Thread.currentThread().getName()+":"+i);    

  17.  

    }    

  18.  

     

  19.  

    }    

  20.  

     

  21.  

    }    


2.ReentrantLock

由于ReentrantLock是java.util.concurrent包下提供的一套互斥鎖,相比Synchronized,ReentrantLock類提供了一些高級功能,主要有以下3項(xiàng):

        1.等待可中斷,持有鎖的線程長期不釋放的時候,正在等待的線程可以選擇放棄等待,這相當(dāng)于Synchronized來說可以避免出現(xiàn)死鎖的情況。通過lock.lockInterruptibly()來實(shí)現(xiàn)這個機(jī)制。

        2.公平鎖,多個線程等待同一個鎖時,必須按照申請鎖的時間順序獲得鎖,Synchronized鎖非公平鎖,ReentrantLock默認(rèn)的構(gòu)造函數(shù)是創(chuàng)建的非公平鎖,可以通過參數(shù)true設(shè)為公平鎖,但公平鎖表現(xiàn)的性能不是很好。

公平鎖、非公平鎖的創(chuàng)建方式:

 
  1.  

    //創(chuàng)建一個非公平鎖,默認(rèn)是非公平鎖    

  2.  

    Lock lock = new ReentrantLock();    

  3.  

    Lock lock = new ReentrantLock(false);    

  4.  

     

  5.  

    //創(chuàng)建一個公平鎖,構(gòu)造傳參true    

  6.  

    Lock lock = new ReentrantLock(true);    

        3.鎖綁定多個條件,一個ReentrantLock對象可以同時綁定對個對象。ReenTrantLock提供了一個Condition(條件)類,用來實(shí)現(xiàn)分組喚醒需要喚醒的線程們,而不是像synchronized要么隨機(jī)喚醒一個線程要么喚醒全部線程。

ReenTrantLock實(shí)現(xiàn)的原理:

之后還會總結(jié)一篇ReenTrantLock相關(guān)的原理底層原理分析,簡單來說,ReenTrantLock的實(shí)現(xiàn)是一種自旋鎖,通過循環(huán)調(diào)用CAS操作來實(shí)現(xiàn)加鎖。它的性能比較好也是因?yàn)楸苊饬耸咕€程進(jìn)入內(nèi)核態(tài)的阻塞狀態(tài)。想盡辦法避免線程進(jìn)入內(nèi)核的阻塞狀態(tài)是我們?nèi)シ治龊屠斫怄i設(shè)計的關(guān)鍵鑰匙。

什么情況下使用ReenTrantLock:

答案是,如果你需要實(shí)現(xiàn)ReenTrantLock的三個獨(dú)有功能時。

ReentrantLock的用法如下:

 
  1.  

    public class SynDemo{    

  2.  

     

  3.  

    public static void main(String[] arg){    

  4.  

    Runnable t1=new MyThread();    

  5.  

    new Thread(t1,"t1").start();    

  6.  

    new Thread(t1,"t2").start();    

  7.  

    }    

  8.  

     

  9.  

    }    

  10.  

    class MyThread implements Runnable {    

  11.  

     

  12.  

    private Lock lock=new ReentrantLock();    

  13.  

    public void run() {    

  14.  

    lock.lock();    

  15.  

    try{    

  16.  

    for(int i=0;i<5;i++)    

  17.  

    System.out.println(Thread.currentThread().getName()+":"+i);    

  18.  

    }finally{    

  19.  

    lock.unlock();    

  20.  

    }    

  21.  

    }    

  22.  

     

  23.  

    }    

看完上述內(nèi)容,你們掌握Synchronized與ReentrantLock有什么區(qū)別的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前標(biāo)題:Synchronized與ReentrantLock有什么區(qū)別
網(wǎng)站路徑:http://aaarwkj.com/article6/goooog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)企業(yè)網(wǎng)站制作、微信公眾號、營銷型網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
美味人妻手机在线观看| 成人激情在线免费电影| 最新手机免费黄色av网站| 91精品日日躁夜夜躁欧美| 日本一区二区在线观看视频| 亚洲黄色片大奶子水多| 色综合久久天天射天天干| 精品亚洲第一区二区免费在线| 一区二区三区蜜桃av| 亚洲精品有码中文字幕| 精品人妻一区二区四区| 肥胖老熟女一区二区三区| 五月天丁香婷婷深爱| 99精品午夜福利在线| 日本中文字幕在线一区| 久久偷拍一区二区三区| 91九色在线porny| 日韩国产人妻一区二区 | 2020年国产97精品自拍| 99精品人妻一区二区三区| 這裏隻有无码人妻久久| 日本高清一区二区网站| 国产高清学生三级一区二区| 日韩视频看看色网站| 欧美+亚洲+精品+三区| 中文字幕乱码亚州精品一区| 久草手机福利在线观看| 中文字幕你懂的在线观看| 一区二区三区毛片免费| 久久精品国产av一一区| 亚洲最大五月六月丁香婷婷| 精品成人在线一区二区| 欧美日韩亚洲1区2区| 日本在线观看免费高清| 欧美国产综合欧美一区二区三区| 午夜福利福利一区二区| 中午字幕人妻少妇久久| 国产女技师口爆在线观看| 国产极品嫩模在线观看91| 熟妇高潮一区二区在线观看| 日韩中文字幕一区二区不卡|