Java线程模型文章已经同步到GitHub开源项目:Java超神道并发并不一定要用到线程,比如PHP中用到多进程。但是Java中的并发基本上是使用线程来实现的。我们先来看看线程在Java虚拟机中是如何实现的。线程的实现主流操作系统都提供了线程的实现,而Java线程提供了不同硬件和操作系统下对线程的统一处理。Thread类的每一个已经开始,还没有结束的实例对象都是一个线程。我们查看了Thread的JDK源码,发现所有的方法都是native修饰的。换句话说,Thread是使用依赖于平台的方式实现的。在不同的操作系统或硬件平台上有不同的实现。因此,标题是线程的实现,而不是Java线程的实现。线程的实现方式主要有三种:内核线程(1:1线程模型)用户线程(1:N线程模型)用户线程+轻量级进程混合(N:M线程模型)内核线程的实现Kernel-LevelThread(KLT)是操作系统内核直接支持的线程。该线程由内核切换完成线程。内核通过操纵调度器来控制内核线程,负责将线??程的任务映射到各个处理器上。程序一般不直接使用内核线程,而是使用它的高层接口:轻量级进程(LWP)。轻量进程就是我们通常意义上的线程。每个轻量级进程都由一个内核线程支持。因此,这种方式被称为1:1线程模型,由于内核线程的支持,每个轻量级进程都是一个独立的调度单元。由于是基于系统内核实现的,因此在创建线程、同步等操作时需要系统内核调用该方法。需要频繁切换用户态和系统内核态,影响性能。用户线程的实现用户线程是指完全建立在用户态的线程库。用户线程的创建、同步、销毁、调度等操作完全在用户态完成,不需要频繁切换内核态。很快。很多高性能数据库中的多线程就是用户线程。由于一个进程对应多个用户线程,线程模型是1:N的劣势:由于所有的线程操作都需要用户来处理,创建,线程的销毁、切换、调度都是用户需要考虑的问题。由于操作系统只是将处理器的资源分配到进程级别,如何处理阻塞以及多处理器分配资源需要用户解决。Java、Ruby等语言都使用过用户线程,但最后都放弃了。用户线程+轻量级进程的混合实现这种情况下既有用户线程也有轻量级进程,而且用户线程的建立还是在用户态,不需要频繁切换内核态,保证了速度高效.轻量级进程充当用户线程和内核线程之间的桥梁。这样就可以利用内核提供的线程调度功能来处理用户线程中存在的问题。用户线程与LWP的比率未定义。因此,它是N:M线程模型Java线程的实现。Java规范没有具体要求使用哪种方法。在JDK1之前。2、使用绿色线程用户线程实现。JDK1.3之后一般使用内核线程来实现,即1:1线程模型。以市场占有率最大的HotSpot虚拟机为例,它的每一个线程都是通过直接映射到操作系统的本机线程来实现的。中间没有额外的结构,所有的线程调度都由操作系统完成,虚拟机完全由操作系统来处理。操作系统支持什么样的线程模型,很大程度上会影响虚拟机在上面的选择这个系统。所以在JVM规范中,并没有限制使用哪种线程模型。由于Thread类统一了底层规范,底层的差异对上层Java应用是透明的。就针对Thread类进行编程。这也间接符合了设计原则中的依赖倒置原则。文章已同步至GitHub开源项目:Java超神之路更多Java知识,欢迎访问!
