9

我知道这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时,它就有机会。

4

3 回答 3

14

Thread.yield(),不像Object.wait()。它只是放弃控制以允许线程切换。它不会影响您的程序的并发性。

无法保证调度程序将在产生后运行哪个线程。

于 2012-05-21T05:01:43.857 回答
10

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

我的评论:

在 java 的早期,当它并不真正支持并行执行,而只支持并发(绿色线程)时,yield()正在暂停当前线程,而 jvm 正在选择另一个线程来恢复。现在,yield由于通常胎面调度是在操作系统级别上,因此没有太大意义。

因此,yield这只是对 JVM 的提示,即当前线程想要休息而不是别的,由线程调度程序决定要做什么。 yield没有任何同步语义。如果线程持有锁,它将继续持有它。

于 2012-05-21T05:13:24.113 回答
0

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

于 2012-08-07T12:40:43.350 回答