Java虚拟机的研究与实现3

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虚拟机将在更多的领域得到不断的完善和发展。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值