我理解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时它就有机会
答案 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更加特别,您可以保证看到您正在等待完成的线程所做的所有更改。