Yield / Join发布监控锁定?

时间:2012-04-16 14:24:39

标签: java multithreading

  

可能重复:
  Does thread.yield() lose the lock on object if called inside a synchronized method?

我知道Thread.sleep()持有锁,但是Object.wait()释放了锁。有人说yield实际上实现了sleep(0)。这是否意味着产量不会释放锁定?

另一个问题。假设当前线程已获得锁定,然后调用anotherThread.join()。当前线程是否释放锁定?

2 个答案:

答案 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的价值。