JVM如何确保线程在进入对象的synchronized方法后获得锁?
7kqas0il1#
布罗问:JVM如何确保...?“JVM”中的“VM”代表“虚拟机”。你的代码本身并不做任何事情。当我们说“你的代码运行”时,我们真正的意思是,JVM会执行你的指令。2并且它是按照JVM规范中的规则来执行的。其中一条规则规定,JVM绝不能同时为同一对象上的两个不同线程执行同步块。但是洋葱有很多层:典型的JVM使用 * 本机线程 *(即,由操作系统提供的线程)来实现Java线程,并且它通常依赖于由OS提供的互斥对象来同步线程。再深入一点,JVM和操作系统本身都不做任何事情:真正让事情发生的是计算机硬件 * 执行 * 操作系统和JVM的指令。完整的“同步是如何工作的?”的答案是一本关于操作系统设计的书中的几章,加上一本关于计算机体系结构的书中的几章,再加上一本关于计算机科学的书。要完全理解这一切,你至少需要知道:
它们都是你可以在维基百科上查到的科目,但我认为,书籍更适合学习这种深度的科目。
wsewodh22#
为了协调多个线程之间的共享数据访问,Java虚拟机将锁与每个对象和类相关联。锁就像一个特权,在任何时候只有一个线程可以“拥有”。如果线程想锁定特定的对象或类,它会请求JVM。在线程向JVM请求锁之后的某个时刻--可能很快,也可能稍后,可能永远不会--JVM会将锁给予线程。当线程不再需要锁时,它会将锁返回给JVM。如果另一个线程请求了相同的锁,JVM会将锁传递给该线程。请查看全文以了解更多信息:http://www.javaworld.com/article/2076971/java-concurrency/how-the-java-virtual-machine-performs-thread-synchronization.html
z9gpfhce3#
有整本书都是关于低级实现和并发特性的。但对于那些希望基本了解它是如何连接起来的,以及背后的逻辑是什么的人来说:JVM使用Java内置监视器对象提供的内在锁实现“同步”特性。在较低级别上,Java内置监视器对象同步器可以通过类似POSIX的同步器实现,即系统级C库。我强烈推荐你浏览这两个YouTube课程,它们以非常好的方式解释了基础知识,这样你就可以很快很好地掌握它并学习它的语义:Java内置监视器对象:概述和激励示例https://www.youtube.com/watch?v=vHAWxXCB9Bg&list=PLZ9NgFYEMxp4UHEwQCltQciArqXDyn6Ms&index=49Java内置监视器对象:协调https://www.youtube.com/watch?v=QNi1BH9JcJE&list=PLZ9NgFYEMxp4UHEwQCltQciArqXDyn6Ms&index=51
3条答案
按热度按时间7kqas0il1#
布罗问:
JVM如何确保...?
“JVM”中的“VM”代表“虚拟机”。你的代码本身并不做任何事情。当我们说“你的代码运行”时,我们真正的意思是,JVM会执行你的指令。2并且它是按照JVM规范中的规则来执行的。其中一条规则规定,JVM绝不能同时为同一对象上的两个不同线程执行同步块。
但是洋葱有很多层:典型的JVM使用 * 本机线程 *(即,由操作系统提供的线程)来实现Java线程,并且它通常依赖于由OS提供的互斥对象来同步线程。
再深入一点,JVM和操作系统本身都不做任何事情:真正让事情发生的是计算机硬件 * 执行 * 操作系统和JVM的指令。
完整的“同步是如何工作的?”的答案是一本关于操作系统设计的书中的几章,加上一本关于计算机体系结构的书中的几章,再加上一本关于计算机科学的书。要完全理解这一切,你至少需要知道:
它们都是你可以在维基百科上查到的科目,但我认为,书籍更适合学习这种深度的科目。
wsewodh22#
为了协调多个线程之间的共享数据访问,Java虚拟机将锁与每个对象和类相关联。锁就像一个特权,在任何时候只有一个线程可以“拥有”。如果线程想锁定特定的对象或类,它会请求JVM。在线程向JVM请求锁之后的某个时刻--可能很快,也可能稍后,可能永远不会--JVM会将锁给予线程。当线程不再需要锁时,它会将锁返回给JVM。如果另一个线程请求了相同的锁,JVM会将锁传递给该线程。
请查看全文以了解更多信息:http://www.javaworld.com/article/2076971/java-concurrency/how-the-java-virtual-machine-performs-thread-synchronization.html
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