编译Java以表现得像GO代码

时间:2014-03-10 02:05:15

标签: java multithreading compiler-construction go

是否有可能编写一个Java编译器或虚拟机,它可以让您编译使用线程和阻塞系统调用的旧Java应用程序,就像编译GO程序一样。

因此新的Thread()。run();将创建轻量级线程,所有阻塞系统调用将改为异步操作系统调用并使轻量级线程产生。

如果没有,那么这是不可能的主要原因是什么!

1 个答案:

答案 0 :(得分:6)

Solaris(以及其他UNIX系统)上早期版本的Sun Java运行时使用了称为“green threads”的用户空间线程系统。如Java 1.1 for Solaris documentation

中所述
  

多对一模型的实现(许多用户线程到一个内核线程)允许应用程序创建可以并发执行的任意数量的线程。在多对一(用户级线程)实现中,所有线程活动都仅限于用户空间。此外,一次只有一个线程可以访问内核,因此操作系统只知道一个可调度实体。因此,这种多线程模型提供有限的并发性,并且不利用多处理器。 Solaris系统上Java线程的初始实现是多对一的,如下图所示。

使用操作系统的线程支持很早就取代了它。对于Solaris prior to Solaris 9,这是一个类似于Go的M:N“多对多”系统,其中线程库通过较少数量的内核级线程调度许多程序线程。在Linux和更新版本的Solaris上使用1:1系统的系统中,用户线程直接与内核级线程相对应,情况并非如此。

我认为从那时起,没有任何严肃的计划让Sun / Oracle JVM远离使用本机线程库。正如历史所示,JVM肯定有可能使用这样的模型,但它似乎并不被认为是值得追求的方向。