你好,请教一下关于java Thread.yield()函数的问题,具体如下

我把代码放在这里面了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()在这个实例中到底扮演的是什么作用呢??还是说我的理解有什么问题??
希望大神帮忙

炎炎设计
浏览 241回答 2
2回答

LEATH

我的理解是 这里是为了让其他处于可执行状态的线程一个执行机会,是用来增加生产者消费者之间的同步机制的效果的,因为业务逻辑很简单,程序一下就执行完了,wait()和notifyAll()不明显,消费者可能根本不会等待,就能拿到good,而生产者也不会等待就生成了good,yield()后就是让当前占用了时间片的线程先把CPU时间片给其他的线程执行,增加他们之间的等待机会。producer1线程运行遇到Thread.yield(),由于是在整个方法上的synchronized,所以,此时即使其他线程执行,producer1也占用着StackImpl对象上的锁, consumer1执行到 goods = theStack.pop() 这里会进行等待,并不会执行下去,直到producer1重新执行buffer[point] = goods ;退出push方法,释放StackImpl对象上的锁,其他线程才能重新获取StackImpl对象上的锁。

神不在的星期二

会放弃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,也就是说不会立即释放锁资源。(但是这个方法,从某种角度,会加速释放锁资源,仅个人见解)  
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
JavaScript