阻塞时线程会做什么

时间:2018-01-20 05:07:26

标签: java concurrency

我想知道当另一个线程持有锁时线程会做什么 是否重新获得锁定?
如果答案是肯定的,那么它是否会在两次重试之间等待一段时间,重试期间有多长? 如果答案是否定的,那么它如何知道何时释放锁定?

== update ==
我在讨论由 synchronized 创建的锁,称为Intrinsic Lock

1 个答案:

答案 0 :(得分:3)

从根本上说,有两种常见的锁类型:

  • 旋转锁:这类似于你所描述的内容;线程将循环(可能会抛出与实现相关的睡眠),直到锁被释放,在等待时不断轮询它。

  • 互斥锁:它使用某种内核资源 - 具体取决于操作系统,但一般情况下,内核负责将线程置于休眠状态(阻塞)并在互斥锁被唤醒时将其唤醒可用。

据我所知,所有Java的锁都以第二种方式工作 - 内核知道另一个线程何时释放互斥锁并重新安排等待线程。只有在锁定准备好后,您的代码才会再次运行。

您可能会在较低级别的代码中看到自旋锁(就像内核本身!),或者等待时间太短的地方,没有必要让线程进入休眠状态等待它被释放(这只有在系统有多个核心的情况下才有效,否则它无法运行需要释放锁的线程和同时等待它的线程 - 它必须重新安排)