Java与线程
在Java里面的并发大多与多线程脱离不了关系;
线程的实现
我们知道,线程是比进程更加轻量级的调度执行单位。各个线程可以共享进程资源,又可以独立调度。
在Java的Thread类中,我们观察源码可以发现,它的所有关键方法都声明成了Native方法,这表示这个方法的实现一般都是与平台相关的。
在实现线程主要有三种方法:
1. 使用内核线程实现;
2. 使用用户线程实现;
3. 使用用户线程加轻量级进程混合实现;
1. 内核线程实现:
内核线程就是直接由操作系统的内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。
程序一般不会直接使用内核线程,而是去使用内核线程的一种高级接口–轻量级进程,这种轻量级进程与内核线程之间1:1的关系称为一对一的线程模型。当然这种轻量级进程有局限性:
1. 基于内核线程实现的,所以各种线程操作,如:创建、析构及同步都需要进行系统调用,系统调用代价高,需要在用户态和内核态来回切换。
2. 每个轻量级进程都需要内核线程的支持,因此会消耗一定的内核资源(如内核线程的栈空间)。
2. 使用用户线程实现
用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。这种进程与用户线程之间1:N的关系称为一对多的线程模型。
用户线程的优势在于不需要系统内核支援,劣势也在于没有内核支援,所有的操作都需要用户处理。所以现在用户线程的使用越来越少。
3.使用用户线程加轻量级进程混合实现
操作系统提供支持的轻量级进程作为用户线程和内核线程之间的桥梁,这样可以使用内核提供的线程调度功能一家处理器映射,并且用户线程的系统调用要通过轻量级进程来完成,大大降低了整个进程被完全阻塞的风险。这种用户线程与轻量级进程的数量比是不确定的,即为N:M的关系。
4. Java线程的实现
对于SUN的JDK来说,都是使用一对一的线程模型实现的,一条Java线程就映射到一条轻量级进程中。
。