如果在synchronized方法中调用,thread.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时它就有机会。

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

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

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

我的评论:

在Java的早期,当它没有真正支持并行执行,但只有并发(绿色线程)时, yield()暂停当前​​线程,并且jvm正在启动另一个线程来恢复。 现在, yield并没有太大的意义,因为胎面调度通常是在操作系统级别上。

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

只有Object类的wait方法释放当前实例的内部锁(该线程可能获得了其他锁,它们不会被释放)。 产量,睡眠,加入不要打扰锁。 但是,join更加特别,您可以保证看到您正在等待完成的线程所做的所有更改。