【问题标题】:what happens when java thread fails to execute synchronized statement? [duplicate]当java线程执行同步语句失败时会发生什么? [复制]
【发布时间】:2019-05-16 06:53:44
【问题描述】:

Java 线程 A 未能执行同步语句,因为另一个线程已获得监视器。
线程A被JVM排队?
以及之后如何通过 1) 或 2) 激活线程 A?

  1. 一旦监视器被释放,JVM 就会发出这个信号,线程 A 可能会被激活
  2. JVM会在一段时间内检测monitor是否可用,如果monitor可用,则可能会激活线程A

【问题讨论】:

  • 会发生什么:线程被阻塞,将停止而不继续。这有点像排队,但取决于操作系统和使用的线程库。#2 最接近;当一个线程被解除阻塞时,它被放入就绪队列(就绪=能够运行),但如果操作系统有其他线程/进程正在运行并且仍然能够继续,它可能不会立即运行。
  • 一个附录:上次我检查过,JVM 可以优化一个很少被竞争(很少被阻塞)的同步块,并将同步检查变成一个自旋锁。这些不会排队,它们只会消耗 CPU 周期,直到锁被释放。
  • "fails to execute"你可能想用'failed'来限定你的意思,因为它不会失败,它只是等到它可以继续。跨度>
  • 是的,完美的答案@markspace我主要是困惑是否因为'同步'语句而阻塞的线程是由monior释放动作通知的,比如因为'等待'语句而阻塞的线程是由notify 语句告知
  • 我的意思是“执行失败”是被阻止直到可以得到监视器@MarkRotteveel

标签: java multithreading


【解决方案1】:

Java 语言规范在17.1 Sysnchronization 部分中有说明:

[...] 一次只有一个线程可以锁定监视器。任何 试图锁定该监视器的其他线程被阻塞,直到它们 可以获得对该监视器的锁定。 [...]

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多