2 回答
TA貢獻1936條經驗 獲得超7個贊
我的理解是 這里是為了讓其他處于可執行狀態的線程一個執行機會,是用來增加生產者消費者之間的同步機制的效果的,因為業務邏輯很簡單,程序一下就執行完了,wait()和notifyAll()不明顯,消費者可能根本不會等待,就能拿到good,而生產者也不會等待就生成了good,yield()后就是讓當前占用了時間片的線程先把CPU時間片給其他的線程執行,增加他們之間的等待機會。
producer1線程運行遇到Thread.yield(),由于是在整個方法上的synchronized,所以,此時即使其他線程執行,producer1也占用著StackImpl對象上的鎖, consumer1執行到 goods = theStack.pop() 這里會進行等待,并不會執行下去,直到producer1重新執行buffer[point] = goods ;退出push方法,釋放StackImpl對象上的鎖,其他線程才能重新獲取StackImpl對象上的鎖。
TA貢獻1963條經驗 獲得超6個贊
會放棄CPU資源,鎖資源不會放棄的。但是當同步代碼執行完畢,資源鎖自然就釋放了。
比如說:這樣一段代碼,同時有多個線程在阻塞等待欲執行這個同步方法
synchronized public boolean print(Integer com)
{
long iii = 100000000;
if(com!=flag)
{
Thread.yield();//直接放棄Cpu資源
while (iii-->0);
}
else
{
..............
}
.........return false;.
}
假如yield會立即釋放對象監視器,那么while(iii--)幾乎就不執行了,但是實際情況是while(iii--)會從100000000變成0,也就是說不會立即釋放鎖資源。(但是這個方法,從某種角度,會加速釋放鎖資源,僅個人見解)
添加回答
舉報
