Java 屈服/连接是否释放监控器锁?

Java 屈服/连接是否释放监控器锁?,java,multithreading,Java,Multithreading,可能重复: 我知道Thread.sleep()持有锁,但是Object.wait()释放锁。有人说,yield实际上实现了sleep(0)。这是否意味着屈服不会释放锁 另一个问题。假设当前线程已获得锁,然后调用另一个线程。join()。当前线程是否释放了锁?除非javadoc提到对象的监视器(例如object.wait()),否则您应该假设所有锁都将继续保持。因此: 这是否意味着屈服不会释放锁 对 当前线程是否释放锁 否。sleep将线程置于等待状态,yield将线程直接返回到就绪池。(因此,

可能重复:

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


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

除非javadoc提到对象的监视器(例如
object.wait()
),否则您应该假设所有锁都将继续保持。因此:

这是否意味着屈服不会释放锁

当前线程是否释放锁


否。

sleep
将线程置于等待状态,
yield
将线程直接返回到就绪池。(因此,如果一个线程产生了错误,它可以直接从运行到就绪池,再由调度程序挑选,而不必等待。)这两者都与锁定无关

从:

sleep导致当前正在执行的线程休眠 (暂时停止执行)在规定期限内,根据 系统计时器和调度程序的精度和准确性。线 不会失去任何监控器的所有权,也不会恢复执行 将取决于调度和所依赖的处理器的可用性 执行线程

需要注意的是,Thread.sleep和Thread.yield都不存在 有任何同步语义。尤其是编译器 不必将缓存在寄存器中的写入刷新到共享内存 在调用Thread.sleep或Thread.yield之前,编译器也不会 调用Thread.sleep后必须重新加载缓存在寄存器中的值 或线程。屈服

例如,在下面的(断开的)代码片段中,假设 this.done是一个非易失性布尔字段:

while (!this.done)
     Thread.sleep(1000);
编译器可以自由读取此字段。只需执行一次,然后重新使用 循环每次执行中的缓存值。这意味着 即使另一个线程更改了循环,循环也永远不会终止 这个的价值。完成

Java[docs][1]说:每个对象都有一个与之关联的内在锁。按照惯例,需要以独占和一致方式访问对象字段的线程必须在访问对象字段之前获取对象的固有锁,然后在处理完这些字段后释放固有锁。所以我觉得,既然锁属于一个对象,
Thread
类的静态方法不应该对锁有任何控制。这就是为什么只有
Object
class'
wait()。我不确定,但这就是我的感受。[1] :虽然yield()与sleep(0)类似,但您可以发现sleep(0)可能需要10-100倍的时间,因此它们并不完全相同。只有锁定对象上的wait()才会释放锁定。