亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

你好,請教一下關于java Thread.yield()函數的問題,具體如下

你好,請教一下關于java Thread.yield()函數的問題,具體如下

炎炎設計 2022-01-07 07:07:52
我把代碼放在這里面了http://hi.baidu.com/sgmxyexmldabere/item/4c92ce54900e793fe6c4a527這段代碼是我從書上抄下來的, 其中43\1行和64行的兩個Thread.yield() 很不理解, 為什么要這么做呢?下面的是我自己猜想的(不知道對不對)當point為-1時, producer1線程運行遇到Thread.yield(),此時的point為0,而且buffer[0]的值仍為null,并未賦值為goods,如果這個時候輪換到consumer1運行,那么consumer1線程此時的goods賦值等于buffer[0],也就是null,那么會出現consumer1消費的貨物為空!如果這種情況發生, 那么Thread.yield()感覺就是多余的, Thread.yield()在這個實例中到底扮演的是什么作用呢??還是說我的理解有什么問題??希望大神幫忙
查看完整描述

2 回答

?
LEATH

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對象上的鎖。

查看完整回答
反對 回復 2022-01-10
?
神不在的星期二

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,也就是說不會立即釋放鎖資源。(但是這個方法,從某種角度,會加速釋放鎖資源,僅個人見解)

 

 


查看完整回答
反對 回復 2022-01-10
  • 2 回答
  • 0 關注
  • 249 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號