您的位置:首页 > 编程语言 > Java开发

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

2012-07-15 21:03 169 查看
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代码:



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

一般情况下大多JVM实现不会自己来编写多线程机制,基本都是借助操作系统的多线程能力,JVM要做的就是如何使用操作系统的多线程机制实现JVM规范层面的语义约束和API层面的多线程要求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐