同步块内的产量?调用yield()后锁定释放?

时间:2013-09-05 11:53:42

标签: java multithreading synchronization

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

  

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

其他线程是否可以执行哪个也想进入synchronized块?

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

}

感谢。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

yield不接受或释放锁,它只是暂停当前的线程执行。因此,在synchronized块中屈服不会让当前线程释放锁定并让其他方法进入synchronized块。应该使用wait/notify方法释放锁。

来自Java Language Specification

  

Thread.sleep导致当前正在执行的线程进入休眠状态   (暂时停止执行)指定的持续时间,但须遵守   系统定时器和调度程序的精度和准确性。线程   不会失去任何监视器的所有权,并恢复执行   将取决于调度和处理器的可用性   执行线程。

     

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

答案 2 :(得分:0)

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