如果在synchronized方法中调用,thread.yield()是否会丢失对象的锁定?

Ama*_*esh 9 java multithreading synchronization sleep yield

我理解这Thread.currentThread().yield()是对线程调度程序的通知,它可以将cpu周期分配给具有相同优先级的其他线程(如果存在任何此类优先级).我的问题是:如果当前线程已经锁定某些对象和调用yield(),它会立即丢失该锁定吗?并且当线程调度程序发现没有这样的线程来分配cpu周期时,那个已调用的线程yield()将再次处于争夺状态以锁定它先前丢失的对象?

我在javadoc和论坛中找不到它[http://www.coderanch.com/t/226223/java-programmer-SCJP/certification/does-sleep-yield-release-lock]有50-50个答案.

我认为yield()(比如说thread1)应该释放锁定,因为如果某个相同优先级的线程(比如说thread2)想要对同一个对象进行操作,那么当线程调度程序最终将cup分配给thread2时它就有机会.

Fra*_* IV 14

Thread.yield()是不喜欢Object.wait().它只是放弃了允许线程切换的控制.它对程序的并发性没有影响.

无法保证调度程序在收益后运行哪个线程.

  • 那么我们应该得出结论,在运行一段同步代码时要求线程产生不是一个好主意吗?毕竟,为了最小化锁定的时间,您希望当前正在运行的线程尽快完成块,并且即使是一个提示,如果考虑到,只会延迟释放锁定. (2认同)

Op *_*kel 8

Java语言规范
17.3睡眠和产量
值得注意的是,Thread.sleep和Thread.yield都没有任何同步语义.特别是,编译器不必在调用Thread.sleep或Thread.yield之前将寄存器中缓存的写入刷新到共享内存,编译器在调用Thread.sleep或Thread之后也不必重新加载缓存在寄存器中的值.让.

我的评论:

在Java的早期,它并没有真正支持并行执行,而只是并发(绿色线程),yield()暂停当前​​线程,并且jvm正在拾取另一个线程来恢复.现在,yield没有太多意义,因为通常在操作系统级别上进行步调.

因此,yield只是当前线程想要休息的JVM的提示而不是其他任何东西,由线程调度程序来决定做什么. yield没有任何同步语义.如果线程保持锁定,它将继续保持它.