Java线程知识拾遗

2017-04-07 From 程序之心 By 丁仪

知识回顾

进程与线程是常常被提到的两个概念。进程拥有独立的代码段、数据空间,线程共享代码段和数据空间,但有独立的栈空间。线程是操作系统调度的最小单位,通常一个进程会包含一个或多个线程。多线程和多进程都可以实现并发处理,如nginx使用多进程方式、tomcat使用多线程方式、Apache支持混合使用。在C/C++等语言中可以同时使用多进程和多线程,而在Java中只能使用多线程。

在Java中,创建线程的唯一方式是创建Thread类的实例,调用实例的start()方法启动线程

Java线程实现

在JDK 1.2之前,Java使用用户线程实现Java线程,在JDK 1.2及之后,Java基于操作系统原生的线程模型实现Java线程。

使用用户线程( User Thread, UT )实现,是指线程建立在用户态空间,线程的建立、同步、调度与销毁都在用户态完成,进程与用户线程之间是1 : N的对应关系。这种情况下,内核无法知道有多少个用户线程,实现较为复杂。

使用内核线程实现,是指基于轻量级进程( Light Weight Process, LWP )来实现线程。每个轻量级进程都有一个内核线程( Kernel-Level Thread, KLT )支持,与内核线程之间是1 : 1的对应关系。这种情况下,调度线程时可能需要在内核态和用户态之间进行切换。由于轻量级进程需要消耗内核资源,能够支持的线程数量是有限的。

如在Windows和Linux系统中,操作系统原生的线程模型是1 : 1的对应关系,对于Sun JDK来说,一个Java线程就对应着一个轻量级进程。

线程调度与状态

在Java中线程的调度方式是抢占式调度,即由系统来负责各个线程的时间分配,并在线程使用完分配的时间后调度下一个线程。任何一个线程都不能独占CPU。Java语言一共设置了10个线程优先级,当两个线程同时等待执行时,优先级高的先被调度。线程的优先级会被映射到操作系统原生线程上去,但各个操作系统的优先级划分不完全一样,因此两个优先级不同的Java线程在操作系统中执行时也可能处于相同的优先级。

Java定义了5种线程状态,分别是新建( New )、运行( Running )、等待( Waiting )、限期等待( Timed Waiting )、阻塞( Blocked )和结束( Terminated )。任一时刻,线程都处于5种状态中的一种,并在各个状态之间切换,如图所示。

其中,各个状态含义如下:

新建:创建后未启动;

运行:对于Java来说,线程已经运行,但对于操作系统来说,可能在运行或等待;

等待:线程等待被其他线程唤醒,如调用了wait、join且没有指定超时时间;

限期等待:线程等待一段时间后被系统唤醒,如调用了sleep、wait、join并设置了超时时间;

阻塞:线程进入同步区域需要与其他线程协调同步,如需要进入synchronized区域但其他线程尚未退出此区域;

结束:run方法执行完成后,线程结束。

虚拟机栈

在Java内存模型中,每个虚拟机线程都有自己私有的虚拟机栈。栈与线程同时创建,其中存储的是线程的栈帧( Stack Frame )。每个方法的调用,都对应着一个栈帧的入栈和出栈。在栈帧中,存储着局部变量表( Local Variable Table )、操作栈( Operand Stack )、动态连接( Dynamic Linking )、返回地址( Return Address )和其他附加信息。

线程的工作内存

在内存模型中,Java要求所有的变量都必须存储在主内存中,每个线程拥有自己的工作内存。工作内存中保存了线程需要读写的变量的主内存的副本。线程对变量的读写操作都在工作内存中直接进行,并不会去操作主内存中的内容,主内存与工作内存的同步由虚拟机完成。不同线程不能访问彼此的工作内存,变量值的传递需要经过主内存才能完成。

Volatile修饰的变量可以保证变量对所有线程可见,即某个线程修改变量后,其他线程总能立刻读到新值。即便如此,多线程并发时,对volatile变量进行自增自减操作也不能保证线程安全。

总结

线程在Java中只能通过创建Thread类的实例来创建。在JDK 1.2之后,Java中的线程基于操作系统原生的线程模型来实现线程。线程的调度方式是抢占式调度,即由系统来负责各个线程的时间分配,并在线程使用完分配的时间后调度下一个线程。Java定义了5种线程状态:新建、运行、等待、限期等待、阻塞和结束。

每个虚拟机线程都有自己私有的虚拟机栈。栈与线程同时创建,其中存储的是线程的栈帧。每个方法的调用,都对应着一个栈帧的入栈和出栈。每个线程拥有自己的工作内存,工作内存中保存了线程需要读写的变量的主内存的副本。线程对变量的读写操作都在工作内存中直接进行,并不会去操作主内存中的内容,主内存与工作内存的同步由虚拟机完成。

本文来源:程序之心,转载请注明出处!

君子曰:学不可以已。
《计算机科学导论(原书第4版)》

本书是国际知名的高等学校计算机科学及相关专业基础课教材,也是非常受欢迎的计算机入门读物。该教材是一本百科全书式的计算机专业入门指南,涉及计算机科学的方方面面。虽然读者对象是计算机专业的学生,但这本书深入浅出、引人入胜,勾画出了计算机科学体系的框架,可以为有志于IT行业的学生奠定计算机科学知识的基础,架设进一步深入专业理论学习的桥梁。

发表感想

© 2016 - 2024 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号