可能重复:
Does thread.yield() lose the lock on object if called inside a synchronized method?
我知道Thread.sleep()
持有锁,但是Object.wait()
释放了锁。有人说yield
实际上实现了sleep(0)
。这是否意味着产量不会释放锁定?
另一个问题。假设当前线程已获得锁定,然后调用anotherThread.join()
。当前线程是否释放锁定?
答案 0 :(得分:4)
除非javadoc提到对象的监视器(例如Object.wait()
),否则您应该假定将继续保持任何锁定。所以:
这是否意味着产量不会释放锁?
是
当前线程是否释放锁定?
没有
答案 1 :(得分:1)
sleep
使线程处于等待状态,yield
将线程直接返回到就绪池。 (因此,如果一个线程产生它,它可以直接从运行到就绪池再次被调度程序选中而无需等待。)两者都没有与锁定有关。
来自Java Language Specification:
Thread.sleep导致当前正在执行的线程进入休眠状态 (暂时停止执行)指定的持续时间,但须遵守 系统定时器和调度程序的精度和准确性。线程 不会失去任何监视器的所有权,并恢复执行 将取决于调度和处理器的可用性 执行线程。
重要的是要注意Thread.sleep和Thread.yield都没有 有任何同步语义。特别是编译器 不必将寄存器中缓存的写入刷新到共享内存 在调用Thread.sleep或Thread.yield之前,编译器也没有 在调用Thread.sleep之后,必须重新加载缓存在寄存器中的值 或Thread.yield。
例如,在下面(破碎的)代码片段中,假设 this.done是一个非易失性布尔字段:
while (!this.done) Thread.sleep(1000);
编译器可以自由阅读this.done字段一次,并重用 每次执行循环时的缓存值。这意味着 循环永远不会终止,即使另一个线程改变了 this.done的价值。