快速业务通道

Java虚拟机的研究与实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
,指向新的内存单元。

Java虚拟机的研究与实现(4)

时间:2011-01-06 计算机与信息技术 夏兵 俞建军

4、线程同步

Java虚拟机中存在着以下两种线程:虚拟机系统线程和用户Java线程。虚拟机系统线程是指虚拟机运行过程中执行其特殊功能的线程,比如垃圾收集器线程等。用户Java线程是指用户编写的Java应用程序中明确表示要启动的线程,并且至少有一个Java线程,即main方法。

而Java语言的一大优势是支持多线程,这种支持主要表现在同步上。在java应用程序中使用synchronized关键字简单地使方法同步,而在Java虚拟机指令中则使用monitorenter和monitorexit指令显式地支持方法同步。Java虚拟机为每个对象都关联一个锁。当当前线程访问共享资源的时候,会执行monitorenter指令来弹出该对象引用,从而获取该对象引用相关联的锁。如果该对象已经被另一线程占用则当前线程就需要进入锁的等待队列,等待释放对象上的锁;已经获取共享资源的线程在释放资源的时候,执行monitorexit指令来弹出对象引用,并且释放与该资源相关联的锁,并让等待队列中的第一个线程获取该对象锁。

当然线程thread也可以根据需要对某对象obj多次上锁,上锁的次数放在计数器counter中。只有当counter为0的时候,即thread加在该对象上的锁被完全释放,其它线程才有机会使用 object。对象的数据结构为:

typedef struct Obj{  uint32 size; //堆中对象的大小  uint16 counter; //对象被上锁的数量  uint16 flag; //对象的状态标志  uint16 thread_id; //对该对象进行加锁的  //线程的ID } Obj;

而在实际Java编程中, 程序员并不需要动手加锁,对象锁只是在Java虚拟机内部使用的。程序员只需要编写同步语句就可以标志一监视区域,当Java虚拟机运行程序的时候,每次进入一个监视区域,它每次都会给对象上锁。

5、线程调度

在本实现中,还需要考虑到在上述等待线程队列中如何选择下一个线程来执行,即线程调度问题。

哪个线程将获取notify命令,这一点在很大程度上取决于虚拟机的设计者,既可以通过使用FIFO队列来调度,也可以根据所有等待线程的优先级来调度,比如唤醒等待队列中优先级最高的线程获取刚刚释放的资源。而Bill Venners则从平台无关和执行效率这两个角度出发,提倡Java虚拟机的设计者应使用java.lang.Object类中的notifyAll()方法来代替notify()方法去唤醒等待队列中的线程。

处理好线程调度问题,就可以节省程序的执行时间,这对于提高Java虚拟机的执行性能是很有帮助的。

总结

本文在研究kaffe的基础上,实现了一虚拟机。并且对Java虚拟机中的关键技术及时编译器、垃圾收集器、线程同步和线程调度等做了分析。本文中所实现的及时编译器虽然在执行速度上比解释型的Java虚拟机快得多,但是不如自适应优化编译器,因为自适应优化编译器具有程序启动快,占用内存少的特点。如果要明显地提高虚拟机的性能,应该更多的从执行引擎着手。另外在Java应用程序的执行过程中许多时间是花费在多线程处理和垃圾收集上,如果在线程同步和线程调度上有所创新,也可以提高虚拟机的执行性能。

研究Java虚拟机的实现过程有重要的意义,程序员可以编写针对于不同平台下的裁减了的Java虚拟机,这样它就可以在实时嵌入式系统得到广泛地应用。相信Java虚拟机将在更多的领域得到不断的完善和发展。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号