Java中哪些操作会使线程释放锁资源
1.sleep()方法
在指定時(shí)間內(nèi)讓當(dāng)前正在執(zhí)行的線程暫停執(zhí)行,但不會(huì)釋放“鎖標(biāo)志”。不推薦使用。
sleep()使當(dāng)前線程進(jìn)入阻塞狀態(tài),在指定時(shí)間內(nèi)不會(huì)執(zhí)行。
2.wait()方法
在其他線程調(diào)用對(duì)象的notify或notifyAll方法前,導(dǎo)致當(dāng)前線程等待。線程會(huì)釋放掉它所占有的“鎖標(biāo)志”,從而使別的線程有機(jī)會(huì)搶占該鎖。
當(dāng)前線程必須擁有當(dāng)前對(duì)象鎖。如果當(dāng)前線程不是此鎖的擁有者,會(huì)拋出IllegalMonitorStateException異常。
喚醒當(dāng)前對(duì)象鎖的等待線程使用notify或notifyAll方法,也必須擁有相同的對(duì)象鎖,否則也會(huì)拋出IllegalMonitorStateException異常。
waite()和notify()必須在synchronized函數(shù)或synchronized block中進(jìn)行調(diào)用。如果在non-synchronized函數(shù)或non-synchronized block中進(jìn)行調(diào)用,雖然能編譯通過(guò),但在運(yùn)行時(shí)會(huì)發(fā)生IllegalMonitorStateException的異常。
3.yield方法
暫停當(dāng)前正在執(zhí)行的線程對(duì)象。
yield()只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。
yield()只能使同優(yōu)先級(jí)或更高優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì)。
4.join方法
等待該線程終止。
等待調(diào)用join方法的線程結(jié)束,再繼續(xù)執(zhí)行。如:t.join();//主要用于等待t線程運(yùn)行結(jié)束,若無(wú)此句,main則會(huì)執(zhí)行完畢,導(dǎo)致結(jié)果不可預(yù)測(cè)。
join()底層就是調(diào)用wait()方法的,wait()釋放鎖資源,故join也釋放鎖資源
1.sleep會(huì)使當(dāng)前線程睡眠指定時(shí)間,不釋放鎖
2.yield會(huì)使當(dāng)前線程重回到可執(zhí)行狀態(tài),等待cpu的調(diào)度,不釋放鎖
3.wait會(huì)使當(dāng)前線程回到線程池中等待,釋放鎖,當(dāng)被其他線程使用notify,notifyAll喚醒時(shí)進(jìn)入可執(zhí)行狀態(tài)
4.當(dāng)前線程調(diào)用 某線程.join()時(shí)會(huì)使當(dāng)前線程等待某線程執(zhí)行完畢再結(jié)束,底層調(diào)用了wait,釋放鎖
總結(jié)
以上是生活随笔為你收集整理的Java中哪些操作会使线程释放锁资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java中的finally中的retur
- 下一篇: 【Java进阶】Spring Cloud