第七章Synchronized的缺陷

一、效率低
1,鎖的釋放情況少
當(dāng)一個(gè)線程獲取到對(duì)應(yīng)的Synchronized這把鎖并且正在執(zhí)行的時(shí)候,其他線程如果也想得到這把鎖只能等待,等待當(dāng)前線程去釋放。但是只有兩種情況下鎖會(huì)得到釋放,一個(gè)是該段同步代碼執(zhí)行完畢了,還有一個(gè)是未執(zhí)行完畢但是執(zhí)行的過(guò)程中拋出了異常。如果我們這把鎖由于要等待IO的操作或者其他操作費(fèi)了很長(zhǎng)時(shí)間,但是有沒(méi)有主動(dòng)地區(qū)釋放鎖,其他線程只能等待,這是非常影響程序執(zhí)行效率的。這個(gè)時(shí)候就需要一種機(jī)制,讓這種一直在等待又影響其他線程的情況得到遏制,對(duì)于Lock,它就可以辦到。

2,試圖獲取鎖時(shí)不能設(shè)定超時(shí)
只能干巴巴地等待,無(wú)法設(shè)定超時(shí)后就不做等待。相比之下,Lock可以設(shè)置超時(shí)時(shí)間。

3,不能中斷一個(gè)正在試圖獲取鎖的線程
Lock是有中斷能力的。

二、不夠靈活(讀寫(xiě)鎖更靈活)
1,加鎖和釋放的時(shí)機(jī)單一,不能自己控制加鎖和解鎖的時(shí)機(jī)
加鎖:鎖住某個(gè)對(duì)象,那么這個(gè)對(duì)象就是這把鎖
釋放:釋放這個(gè)對(duì)象,意味著解了這把鎖

2,每一個(gè)鎖僅有單一的條件(某個(gè)對(duì)象),可能是不夠的。
比如我們有一種讀寫(xiě)鎖,它的加鎖釋放鎖的時(shí)機(jī),非常靈活。它在做讀操作的時(shí)候是不會(huì)加鎖的,而在做寫(xiě)操作的時(shí)候才會(huì)加鎖。這樣就可以大大提高我們的效率又不會(huì)造成線程安全問(wèn)題,因?yàn)樽x的時(shí)候不會(huì)帶來(lái)風(fēng)險(xiǎn)。

所以我們是希望一個(gè)鎖能夠更加靈活的,讓我們能夠去掌控它的加鎖時(shí)機(jī)和釋放時(shí)機(jī)。

三、無(wú)法知道是否成功獲取到鎖
我們用Synchronized對(duì)代碼加鎖,我們沒(méi)有辦法提前知道它是成功了還是失敗了,相比之下,Lock可以去嘗試,如果成功了dosth1,如果沒(méi)有成功dosth2。
Lock interface相關(guān)方法

  public static void main(String[] args) throws InterruptedException {
    Lock lock = new ReentrantLock();
    //可以配置自己的鎖,靈活地控制
    lock.lock();//控制加鎖的時(shí)機(jī)
    lock.unlock();//控制釋放的時(shí)機(jī)

    lock.tryLock();//嘗試獲取這把鎖
    lock.tryLock(10,TimeUnit.SECONDS);//嘗試10s內(nèi)獲取這把鎖,如果過(guò)了時(shí)間還沒(méi)獲取到就放棄

  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容