2 回答

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
我的理解是 這里是為了讓其他處于可執(zhí)行狀態(tài)的線程一個(gè)執(zhí)行機(jī)會(huì),是用來增加生產(chǎn)者消費(fèi)者之間的同步機(jī)制的效果的,因?yàn)闃I(yè)務(wù)邏輯很簡(jiǎn)單,程序一下就執(zhí)行完了,wait()和notifyAll()不明顯,消費(fèi)者可能根本不會(huì)等待,就能拿到good,而生產(chǎn)者也不會(huì)等待就生成了good,yield()后就是讓當(dāng)前占用了時(shí)間片的線程先把CPU時(shí)間片給其他的線程執(zhí)行,增加他們之間的等待機(jī)會(huì)。
producer1線程運(yùn)行遇到Thread.yield(),由于是在整個(gè)方法上的synchronized,所以,此時(shí)即使其他線程執(zhí)行,producer1也占用著StackImpl對(duì)象上的鎖, consumer1執(zhí)行到 goods = theStack.pop() 這里會(huì)進(jìn)行等待,并不會(huì)執(zhí)行下去,直到producer1重新執(zhí)行buffer[point] = goods ;退出push方法,釋放StackImpl對(duì)象上的鎖,其他線程才能重新獲取StackImpl對(duì)象上的鎖。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
會(huì)放棄CPU資源,鎖資源不會(huì)放棄的。但是當(dāng)同步代碼執(zhí)行完畢,資源鎖自然就釋放了。
比如說:這樣一段代碼,同時(shí)有多個(gè)線程在阻塞等待欲執(zhí)行這個(gè)同步方法
synchronized public boolean print(Integer com)
{
long iii = 100000000;
if(com!=flag)
{
Thread.yield();//直接放棄Cpu資源
while (iii-->0);
}
else
{
..............
}
.........return false;.
}
假如yield會(huì)立即釋放對(duì)象監(jiān)視器,那么while(iii--)幾乎就不執(zhí)行了,但是實(shí)際情況是while(iii--)會(huì)從100000000變成0,也就是說不會(huì)立即釋放鎖資源。(但是這個(gè)方法,從某種角度,會(huì)加速釋放鎖資源,僅個(gè)人見解)
添加回答
舉報(bào)