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,也就是说不会立即释放锁资源。(但是这个方法,从某种角度,会加速释放锁资源,仅个人见解)
添加回答
举报