【问题标题】:Yield inside synchronized block? Lock release after calling yield()?同步块内的产量?调用 yield() 后释放锁?
【发布时间】:2013-09-09 05:54:09
【问题描述】:

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

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

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

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

}

谢谢。

【问题讨论】:

  • 不要缩进文本块,因为站点格式化程序会将其视为代码并使其不可读。我试图解决这个问题,但你“未修复”它。我会再修一次,但请不要改回来。

标签: java multithreading synchronization


【解决方案1】:

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

【讨论】:

  • +1 简而言之,这是一个非常糟糕的主意。请改用this.lock.wait(1);
【解决方案2】:

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

来自Java Language Specification

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-04
      • 2021-02-22
      • 2012-12-09
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多