Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在同步方法内调用,thread.yield()是否会丢失对对象的锁定?_Java_Multithreading_Synchronization_Sleep_Yield - Fatal编程技术网

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

Java 如果在同步方法内调用,thread.yield()是否会丢失对对象的锁定?,java,multithreading,synchronization,sleep,yield,Java,Multithreading,Synchronization,Sleep,Yield,我知道Thread.currentThread().yield()是对线程调度程序的一个通知,它可以将cpu周期分配给其他具有相同优先级的线程(如果存在)。 我的问题是:如果当前线程已经锁定了某些对象并调用了yield(),它会立即丢失该锁吗?当线程调度程序发现没有这样的线程来分配cpu周期时,调用了yield()的线程将再次为锁定它先前丢失的对象而斗争 我在javadoc和论坛中找不到它[http://www.coderanch.com/t/226223/java-programmer-SCJ

我知道
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()。它只是为了允许线程切换而放弃控制。这对程序的并发性没有影响

无法保证调度程序将在屈服后运行哪个线程


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

我的评论是:

在java早期,它并不真正支持并行执行,只支持并发(绿色线程),
yield()
挂起当前线程,而jvm则选择另一个线程来恢复。如今,
yield
没有太大意义,因为通常情况下,tread调度是在操作系统级别上进行的


因此,
yield
只是给JVM一个提示,当前线程想休息一下,其他什么都不做,由线程调度程序决定该做什么<代码>产量
没有任何同步语义。如果线程持有锁,它将继续持有它。

只有对象类的等待方法才会释放当前实例的内在锁(线程可能会获得其他锁,它们不会被释放)。屈服,睡觉,加入,不用担心锁。然而,join更为特殊,您可以保证看到等待完成的线程所做的所有更改

那么,我们是否应该得出这样的结论:在运行一段同步代码时要求线程让步不是一个好主意?毕竟,为了尽可能缩短锁被持有的时间,您希望当前正在运行的线程尽快完成块,并且屈服,即使是一个提示,如果考虑进去,也只会延迟锁的释放。@edalorzo同意。这是徒劳的。为什么声明锁只是为了礼貌地服从其他线程?这确实取决于您的应用程序,但一般来说,yield()不是必需的。我的意思是,如果锁中有另一个线程需要做的工作,那么它就必须完成。我的意思是,假设我运行的是一个单CPU JVM实现,它不使用时间片抢占式调度,如果我产生一个持有锁的线程,然后,其他不等待相同锁的线程可以获得一些CPU时间,只要JVM实现考虑到该提示。但是锁将阻止其他线程等待它运行,因为它仍将由生成的线程持有。因此,在这种情况下屈服,即使可能,听起来也像是个坏主意,一股代码的味道,嗯。@Amaresh,你想得太多了。JVM将调度其他线程。您不需要帮助它,因为绿色线程和Windows 3已经消亡;-)我目前正在处理我的SCJP 1.6,并根据认证的要求进行了测试,其中同步函数中存在一个屈服调用,并且它确实将执行屈服于另一个线程。@Op De Cirkel谢谢!加入怎么样?这也有同样的表现吗?