真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

5分鐘搞清楚Synchronized和Lock的概念與區(qū)別

前言

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的順昌網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

并發(fā)編程中,鎖是經(jīng)常需要用到的,今天我們一起來看下Java中的鎖機(jī)制:synchronized和lock。

5分鐘搞清楚Synchronized和Lock的概念與區(qū)別

Synchronized 和 Lock的概念

Synchronized 是Java 并發(fā)編程中很重要的關(guān)鍵字,另外一個(gè)很重要的是 volatile。Syncronized 的目的是一次只允許一個(gè)線程進(jìn)入由他修飾的代碼段,從而允許他們進(jìn)行自我保護(hù)。Synchronized 很像生活中的鎖例子,進(jìn)入由Synchronized 保護(hù)的代碼區(qū)首先需要獲取 Synchronized 這把鎖,其他線程想要執(zhí)行必須進(jìn)行等待。Synchronized 鎖住的代碼區(qū)域執(zhí)行完成后需要把鎖歸還,也就是釋放鎖,這樣才能夠讓其他線程使用。

Lock 是 Java并發(fā)編程中很重要的一個(gè)接口,它要比 Synchronized 關(guān)鍵字更能直譯"鎖"的概念,Lock需要手動(dòng)加鎖和手動(dòng)解鎖,一般通過 lock.lock() 方法來進(jìn)行加鎖, 通過 lock.unlock() 方法進(jìn)行解鎖。與 Lock 關(guān)聯(lián)密切的鎖有 ReetrantLock 和 ReadWriteLock。

ReetrantLock 實(shí)現(xiàn)了Lock接口,它是一個(gè)可重入鎖,內(nèi)部定義了公平鎖與非公平鎖。

ReadWriteLock 一個(gè)用來獲取讀鎖,一個(gè)用來獲取寫鎖。也就是說將文件的讀寫操作分開,分成2個(gè)鎖來分配給線程,從而使得多個(gè)線程可以同時(shí)進(jìn)行讀操作。ReentrantReadWirteLock實(shí)現(xiàn)了ReadWirteLock接口,并未實(shí)現(xiàn)Lock接口。

5分鐘搞清楚Synchronized和Lock的概念與區(qū)別

Synchronized 和 Lock 的使用

Synchronized 和 Lock 的使用:

下面是 Synchronized 的例子:

在方法上使用 Synchronized

方法聲明時(shí)使用,放在范圍操作符之后,返回類型聲明之前。即一次只能有一個(gè)線程進(jìn)入該方法,其他線程要想在此時(shí)調(diào)用該方法,只能排隊(duì)等候。

private?int?number;
public?synchronized?void?numIncrease(){
??number++;
}

在某個(gè)代碼段使用 Synchronized

你也可以在某個(gè)代碼塊上使用 Synchronized 關(guān)鍵字,表示只能有一個(gè)線程進(jìn)入某個(gè)代碼段。

public?void?numDecrease(Object?num){
??synchronized?(num){
????number++;
??}
}

使用 Synchronized 鎖住整個(gè)對(duì)象

synchronized后面括號(hào)里是一對(duì)象,此時(shí)線程獲得的是對(duì)象鎖。

public?void?test()?{
??synchronized?(this)?{
????//?...
??}
}

下面是 Lock 的例子:

Lock是一個(gè)接口,它主要由下面這幾個(gè)方法

public?interface?Lock?{
????void?lock();
????void?lockInterruptibly()?throws?InterruptedException;
????boolean?tryLock();
????boolean?tryLock(long?time,?TimeUnit?unit)?throws?InterruptedException;
????void?unlock();
????Condition?newCondition();
}

對(duì)上面 Lock 接口的方法做一個(gè)簡單的解釋:

lock(): lock 方法可能是平常使用最多的一個(gè)方法,就是用來獲取鎖。如果鎖被其他線程獲取,則進(jìn)行等待。

如果采用Lock,必須主動(dòng)去釋放鎖,并且在發(fā)生異常時(shí),不會(huì)自動(dòng)釋放鎖。

Lock?lock?=?...;
lock.lock();
try{
????//處理任務(wù)
}catch(Exception?ex){
?????
}finally{
????lock.unlock();???//釋放鎖
}

tryLock() :方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true,如果獲取失?。存i已被其他線程獲取),則返回false,也就說這個(gè)方法無論如何都會(huì)立即返回。在拿不到鎖時(shí)不會(huì)一直在那等待。

tryLock(long time, TimeUnit unit) 方法和tryLock()方法是類似的,只不過區(qū)別在于這個(gè)方法在拿不到鎖時(shí)會(huì)等待一定的時(shí)間,在時(shí)間期限之內(nèi)如果還拿不到鎖,就返回false。如果如果一開始拿到鎖或者在等待期間內(nèi)拿到了鎖,則返回true。

Lock?lock?=?...;
if(lock.tryLock())?{
?????try{
?????????//處理任務(wù)
?????}catch(Exception?ex){
?????????
?????}finally{
?????????lock.unlock();???//釋放鎖
?????}
}else?{
????//如果不能獲取鎖,則直接做其他事情
}

lockInterruptibly() : 此方法比較特殊,當(dāng)通過這個(gè)方法去獲取鎖時(shí),如果線程正在等待獲取鎖,則這個(gè)線程能夠響應(yīng)中斷,即中斷線程的等待狀態(tài)。也就是說,當(dāng)兩個(gè)線程同時(shí)通過 lock.lockInterruptibly() 想獲取某個(gè)鎖時(shí),假若此時(shí)線程A獲取到了鎖,而線程B只有在等待,那么對(duì)線程B調(diào)用 threadB.interrupt() 方法能夠中斷線程B的等待過程。

由于 lockInterruptibly() 的聲明中拋出了異常,所以 lock.lockInterruptibly() 必須放在try塊中或者在調(diào)用lockInterruptibly() 的方法外聲明拋出 InterruptedException。一般形式如下:

public?void?method()?throws?InterruptedException?{
????lock.lockInterruptibly();
????try?{
?????//.....
????}
????finally?{
????????lock.unlock();
????}
}

一般來說,使用Lock必須在try{}catch{}塊中進(jìn)行,并且將釋放鎖的操作放在finally塊中進(jìn)行,以保證鎖一定被被釋放,防止死鎖的發(fā)生。

注意,當(dāng)一個(gè)線程獲取了鎖之后,是不會(huì)被interrupt()方法中斷的。因?yàn)楸旧碓谇懊娴奈恼轮兄v過單獨(dú)調(diào)用interrupt()方法不能中斷正在運(yùn)行過程中的線程,只能中斷阻塞過程中的線程。因此當(dāng)通過lockInterruptibly()方法獲取某個(gè)鎖時(shí),如果不能獲取到,只有進(jìn)行等待的情況下,是可以響應(yīng)中斷的。而用synchronized修飾的話,當(dāng)一個(gè)線程處于等待某個(gè)鎖的狀態(tài),是無法被中斷的,只有一直等待下去。

歡迎大家關(guān)注我的公種浩【程序員追風(fēng)】,文章都會(huì)在里面更新,整理的資料也會(huì)放在里面。

5分鐘搞清楚Synchronized和Lock的概念與區(qū)別

Synchronized 和 Lock 的主要區(qū)別

Synchronzied 和 Lock 的主要區(qū)別如下:

  • 存在層面:Syncronized 是Java 中的一個(gè)關(guān)鍵字,存在于 JVM 層面,Lock 是 Java 中的一個(gè)接口

  • 鎖的釋放條件:1. 獲取鎖的線程執(zhí)行完同步代碼后,自動(dòng)釋放;2. 線程發(fā)生異常時(shí),JVM會(huì)讓線程釋放鎖;Lock 必須在 finally 關(guān)鍵字中釋放鎖,不然容易造成線程死鎖

  • 鎖的獲取: 在 Syncronized 中,假設(shè)線程 A 獲得鎖,B 線程等待。如果 A 發(fā)生阻塞,那么 B 會(huì)一直等待。在 Lock 中,會(huì)分情況而定,Lock 中有嘗試獲取鎖的方法,如果嘗試獲取到鎖,則不用一直等待

  • 鎖的狀態(tài):Synchronized 無法判斷鎖的狀態(tài),Lock 則可以判斷

  • 鎖的類型:Synchronized 是可重入,不可中斷,非公平鎖;Lock 鎖則是 可重入,可判斷,可公平鎖

  • 鎖的性能:Synchronized 適用于少量同步的情況下,性能開銷比較大。Lock 鎖適用于大量同步階段:

  • Lock 鎖可以提高多個(gè)線程進(jìn)行讀的效率(使用 readWriteLock)

  • 在競(jìng)爭(zhēng)不是很激烈的情況下,Synchronized的性能要優(yōu)于ReetrantLock,但是在資源競(jìng)爭(zhēng)很激烈的情況下,Synchronized的性能會(huì)下降幾十倍,但是ReetrantLock的性能能維持常態(tài);

  • ReetrantLock 提供了多樣化的同步,比如有時(shí)間限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。

最后

?歡迎大家一起交流,喜歡文章記得點(diǎn)個(gè)贊喲,感謝支持!


文章題目:5分鐘搞清楚Synchronized和Lock的概念與區(qū)別
路徑分享:http://weahome.cn/article/jsjocs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部