jvm Synchronized关键字内部实现

uurity8g  于 2022-11-07  发布在  其他
关注(0)|答案(3)|浏览(122)

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

7kqas0il

7kqas0il1#

布罗问:
JVM如何确保...?
“JVM”中的“VM”代表“虚拟机”。你的代码本身并不做任何事情。当我们说“你的代码运行”时,我们真正的意思是,JVM会执行你的指令。2并且它是按照JVM规范中的规则来执行的。其中一条规则规定,JVM绝不能同时为同一对象上的两个不同线程执行同步块。
但是洋葱有很多层:典型的JVM使用 * 本机线程 *(即,由操作系统提供的线程)来实现Java线程,并且它通常依赖于由OS提供的互斥对象来同步线程。
再深入一点,JVM和操作系统本身都不做任何事情:真正让事情发生的是计算机硬件 * 执行 * 操作系统和JVM的指令。
完整的“同步是如何工作的?”的答案是一本关于操作系统设计的书中的几章,加上一本关于计算机体系结构的书中的几章,再加上一本关于计算机科学的书。要完全理解这一切,你至少需要知道:

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

它们都是你可以在维基百科上查到的科目,但我认为,书籍更适合学习这种深度的科目。

wsewodh2

wsewodh22#

为了协调多个线程之间的共享数据访问,Java虚拟机将锁与每个对象和类相关联。锁就像一个特权,在任何时候只有一个线程可以“拥有”。如果线程想锁定特定的对象或类,它会请求JVM。在线程向JVM请求锁之后的某个时刻--可能很快,也可能稍后,可能永远不会--JVM会将锁给予线程。当线程不再需要锁时,它会将锁返回给JVM。如果另一个线程请求了相同的锁,JVM会将锁传递给该线程。
请查看全文以了解更多信息:http://www.javaworld.com/article/2076971/java-concurrency/how-the-java-virtual-machine-performs-thread-synchronization.html

z9gpfhce

z9gpfhce3#

有整本书都是关于低级实现和并发特性的。
但对于那些希望基本了解它是如何连接起来的,以及背后的逻辑是什么的人来说:JVM使用Java内置监视器对象提供的内在锁实现“同步”特性。在较低级别上,Java内置监视器对象同步器可以通过类似POSIX的同步器实现,即系统级C库。
我强烈推荐你浏览这两个YouTube课程,它们以非常好的方式解释了基础知识,这样你就可以很快很好地掌握它并学习它的语义:
Java内置监视器对象:概述和激励示例
https://www.youtube.com/watch?v=vHAWxXCB9Bg&list=PLZ9NgFYEMxp4UHEwQCltQciArqXDyn6Ms&index=49
Java内置监视器对象:协调
https://www.youtube.com/watch?v=QNi1BH9JcJE&list=PLZ9NgFYEMxp4UHEwQCltQciArqXDyn6Ms&index=51

相关问题