我正在创建一个多线程并在其中调用yield()
。
java.lang.Thread.yield()方法导致当前正在执行的线程对象暂时暂停并允许其他线程执行。
其他线程是否可以执行哪个也想进入synchronized块?
synchronized(this.lock)
{
//calling yield here.
}
感谢。
答案 0 :(得分:5)
据我所知,Yield()只放弃CPU上的剩余时间片并退回队列。它不会释放任何同步对象。
答案 1 :(得分:4)
yield
不接受或释放锁,它只是暂停当前的线程执行。因此,在synchronized
块中屈服不会让当前线程释放锁定并让其他方法进入synchronized
块。应该使用wait/notify
方法释放锁。
Thread.sleep导致当前正在执行的线程进入休眠状态 (暂时停止执行)指定的持续时间,但须遵守 系统定时器和调度程序的精度和准确性。线程 不会失去任何监视器的所有权,并恢复执行 将取决于调度和处理器的可用性 执行线程。
重要的是要注意Thread.sleep和Thread.yield都没有任何同步语义。特别是编译器 不必将寄存器中缓存的写入刷新到共享内存 在调用Thread.sleep或Thread.yield之前,编译器也没有 在调用Thread.sleep之后,必须重新加载缓存在寄存器中的值 或Thread.yield。
答案 2 :(得分:0)
yield
允许上下文切换到其他线程,因此该线程不会消耗进程的整个CPU使用率。线程仍然保持锁定。开发人员有责任处理死锁问题。