3

我正在创建多个线程并yield()在其中调用。

java.lang.Thread.yield() 方法使当前正在执行的线程对象暂时暂停并允许其他线程执行。

是否有可能执行其他线程也想进入同步块?

synchronized(this.lock)
{
 //calling yield here.

}

谢谢。

4

3 回答 3

5

据我所知, Yield() 只放弃了 CPU 上的剩余时间片并退回到队列中。它不会释放任何同步对象。

于 2013-09-05T11:57:56.310 回答
4

yield不获取或释放锁,它只是暂停当前线程执行。所以在synchronizedblock中yield不会让当前线程释放锁而让其他方法进入synchronizedblock。wait/notify应该使用方法来释放锁。

来自Java 语言规范

Thread.sleep 使当前正在执行的线程在指定的持续时间内休眠(暂时停止执行),具体取决于系统计时器和调度程序的精度和准确性。线程不会失去任何监视器的所有权,并且恢复执行将取决于调度和执行线程的处理器的可用性。

重要的是要注意 Thread.sleep 和 Thread.yield 都没有任何同步语义。特别是,编译器不必在调用 Thread.sleep 或 Thread.yield 之前将缓存在寄存器中的写入刷新到共享内存,编译器也不必在调用 Thread.sleep 或 Thread 之后重新加载缓存在寄存器中的值。屈服。

于 2013-09-05T11:59:39.447 回答
0

yield允许上下文切换到其他线程,因此该线程不会消耗进程的整个 CPU 使用率。线程仍然持有锁。处理死锁是开发人员的责任。

于 2013-09-05T12:01:39.540 回答