代码之家  ›  专栏  ›  技术社区  ›  Joshua Fox

当锁上有几个线程被阻塞时,它们以什么顺序恢复运行?

  •  5
  • Joshua Fox  · 技术社区  · 14 年前

    螺纹A,B,C依次到达 已同步 方法 f() 在单个对象中。

    所有人都有同样的优先权。

    B和C被阻塞。

    一片树叶 f()

    现在哪个线程开始运行

    如果C的优先级比B高,这是否保证C将运行而不是B?

    7 回复  |  直到 14 年前
        1
  •  3
  •   Borealid    14 年前

    不能 产生可靠的排序,你还没有足够的测试。因为您无法知道线程进入锁的顺序,所以您也无法知道线程离开锁的顺序—即使有FIFO策略。

        2
  •  10
  •   Nikolai Fetissov    14 年前

    对于所有应用程序的意图和目的,您可以假设顺序是 完全随机的 . 不要玩弄优先权-你可以很容易地引入微妙的 priority inversion 非常危险的虫子 非常 很难抓住。

        3
  •  5
  •   Carl Smotricz    14 年前

    这也是好事。如果编写的代码依赖于优先级来确定执行顺序,那么就错了。你要么明确而有意地控制这些东西,要么为发生的一切做好准备。最好的方法是编写不管怎样都能正常工作的代码。

    优先事项是 暗示

        4
  •  1
  •   Mateusz Dymczyk    14 年前

    像往常一样,你永远不知道。

        5
  •  0
  •   Ecarrion    14 年前

    这取决于操作系统的调度程序使用的算法。看看 this

    但是你可以做一些技巧来模拟欲望的顺序。

        6
  •  0
  •   YoK    14 年前

    当系统中所有可运行的线程具有相同的优先级时,调度器将选择下一个线程以简单的、非抢占式的循环调度顺序运行。

    有趣的老链接:

    http://journals.ecs.soton.ac.uk/java/tutorial/java/threads/priority.html

        7
  •  0
  •   Konrad Garus    14 年前

    信号量是公平的 -什么保证了先进先出。