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

时间:2012-05-21 04:55:36

标签: 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时它就有机会

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:8)

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

我的评论:

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

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

答案 2 :(得分:0)

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