为了账号安全,请及时绑定邮箱和手机立即绑定

你好,请教一下关于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 关注
  • 240 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号