《Java平台体系》——第二章 JVM——JVM实现中的多线程

JVM抽象架构​中我们谈到了多线程中解决数据不一致问题的同步锁概念,从Java字节码交给JVM的信息来看除了在方法上标注synchronized和两条同步指令(194 (0xc2) monitorenter和195 (0xc3) monitorexit)外,真还没有见到任何字节码可以告诉JVM何时启动一个线程相关的信息,但Java中确实是支持多线程的,这是怎么回事?

我们摘JVM规范中的两段关于线程的描述:

While most of the preceding discussion is concerned only with the behavior of code as executed by a single thread, the Java virtual machine can support many threads of execution at once. These threads independently execute code that operates on values and objects residing in a shared main memory. 

Threads are created and managed by the classes Thread and ThreadGroup. Creating a Thread object creates a thread, and that is the only way to create a thread. When the thread is created, it is not yet active; it begins to run when its start method is called.

翻译:

虽然在规范中我们一直在讨论单线程的执行过程,但JVM是可以支持多线程的,每个线程都能够独立地执行自己的代码,操作共享主内存中的数据。

线程由类Thread和ThreadGroup进行管理,通过创建Thread对象来创建一个线程,通过Thread的start方法启动线程。

总结一下:

□ 首先JVM规范不强制每个JVM都必须实现多线程(Java SE是要求的)。
□ 如果要实现,请从API规范层面在Thread和ThreadGroup类中实现。
□ 只要实现,必须要在JVM层面实现方法同步和同步块的语义(这句话是否怪怪的?但这是我觉得最重要的一句话)。

前面的总结我们可以更进一步的总结:只要实现API层面的类Thread和ThreadGroup,就必须是JVM级别的实现,因为它必须要和JVM直接交流。这也是为什么该小节内容放到JVM实现和该小节的题目为JVM实现中的多线程的原因。

我们接着说Thread和ThreadGroup两个类,类在JVM规范层面来说它编译之后一定是Java字节码,但我们又知道Java字节码中根本没有线程的信息,这并不奇怪,在JVM抽象架构中我们提到了JNI(Java本地接口)的概念,其实现就是通过JNI的。

看看Sun JDK(现在是OpenJDK)对Thread的start方法实现的Java代码:

《Java平台体系》——第二章 JVM——JVM实现中的多线程


在start0前面有一个native,明白了吗?关于JNI的内容请参考JNI(Java本地接口)​小节的内容。

一般情况下大多JVM实现不会自己来编写多线程机制,基本都是借助操作系统的多线程能力,JVM要做的就是如何使用操作系统的多线程机制实现JVM规范层面的语义约束和API层面的多线程要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值