Java 同步关键字内部实现

Java 同步关键字内部实现,java,multithreading,synchronization,jvm,Java,Multithreading,Synchronization,Jvm,JVM如何确保线程在进入对象的同步方法后获得锁 为了协调多个线程之间的共享数据访问,Java虚拟机将锁与每个对象和类相关联。锁就像一个特权,在任何时候只有一个线程可以“拥有”。如果线程想要锁定特定的对象或类,它会询问JVM。在线程向JVM请求锁后的某个时刻——可能很快,可能很晚,可能永远——JVM向线程提供锁。当线程不再需要锁时,它会将锁返回给JVM。如果另一个线程请求了相同的锁,JVM会将锁传递给该线程 查看整篇文章了解更多信息:广泛问题: JVM如何确保 “JVM”中的“VM”代表“虚拟机”

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

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

查看整篇文章了解更多信息:

广泛问题:

JVM如何确保

“JVM”中的“VM”代表“虚拟机”。您的代码本身不会做任何事情。当我们说“您的代码运行”时,我们真正的意思是JVM执行您的指令。它是根据JVM规范中列出的规则来执行的。其中一条规则规定,JVM决不能同时为同一对象上的两个不同线程执行同步块

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

更深入地说,无论是JVM还是操作系统本身都没有做任何事情:真正让事情发生的是执行操作系统和JVM指令的计算机硬件

“同步是如何工作的?”的完整答案是一本关于操作系统设计的书中的几章,加上一本关于计算机体系结构的书中的几章,再加上一张计算机科学的照片。要完全理解这一切,您至少需要了解:

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

这些都是你可以在维基百科上查到的主题,但在我看来,书籍更适合学习这种深度的主题。

有整本书都是关于低级实现和并发功能的

但对于那些希望基本了解所有连接方式及其背后逻辑的人来说: JVM使用Java内置监视器对象提供的内在锁实现“同步”特性。 在较低级别上,Java内置的监视器对象同步器可以通过与POSIX类似的同步器(即系统级C库)来实现

我强烈建议您学习这两门youtube课程,这两门课程以非常好的方式解释了基础知识,因此您可以快速掌握它并学习它的语义:

Java内置监视器对象:概述和激励示例

Java内置监控对象:协调


您能指出“synchronized”关键字后面的同步原语与CAS之间的区别吗?两者都必须在某个时刻执行同步,对吗?因此,我认为要么线程必须等待/锁定(“同步”),要么执行不必要的额外工作(CAS)(addl work=循环/比较)。不知何故,做额外的工作似乎比等待有更好的表现!我似乎没有得到足够的信息来理解为什么/如何CAS比原子增量的“同步”更好?与CAS相比,“synchronized”关键字在JVM/OS/HW级别执行了哪些额外工作?