同步关键字内部实现

在进入对象的同步方法后,JVM如何确保线程获得锁定?

广泛的问题:

JVM如何确保……?

“JVM”中的“VM”代表“虚拟机”。 您的代码本身不会执行任何操作。 当我们说“你的代码运行”时,我们真正的意思是,JVM 执行你的指令。 它是按照JVM规范中规定的规则执行的。 其中一条规则是JVM必须永远不要同时为同一对象上的两个不同线程执行同步块。

但是洋葱有很多层:一个典型的JVM使用本机线程 (即操作系统提供的线程)来实现Java线程,它通常依赖于操作系统提供的互斥对象来同步线程。

更深入的是,JVM和操作系统都没有真正做任何事情:它是执行操作系统和JVM指令的计算机硬件,真正让事情发生。

“同步如何工作?”的完整答案。 这是一本关于操作系统设计的书中的几章,还有一本关于计算机体系结构的书中的几章,以及计算机科学的一部分。 要完全理解这一切,您至少需要知道:

  • “用户模式指令”与“特权模式指令”,
  • 系统调用如何工作,
  • 操作系统“调度程序”如何执行“上下文切换”
  • 硬件同步原语,如“比较和交换(CAS)”,“测试和设置(TAS)”,“加载链接/存储条件(LL / SC)”

它们都是你可以在维基百科上查找的主题,但IMO,书籍更适合学习这种深度的主题。

为了协调多个线程之间的共享数据访问,Java虚拟机将锁与每个对象和类相关联。 锁就像一个特权,任何时候只有一个线程可以“拥有”。 如果线程想要锁定特定对象或类,它会询问JVM。 在线程要求JVM进行锁定之后的某个时刻 – 可能很快,也许是稍后,可能永远不会 – JVM为该线程提供锁定。 当线程不再需要锁时,它会将其返回给JVM。 如果另一个线程请求了相同的锁,则JVM将锁传递给该线程。

有关更多信息,请查看整篇文章: http : //www.javaworld.com/article/2076971/java-concurrency/how-the-java-virtual-machine-performs-thread-synchronization.html