购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

Chapter 3
第3章
JVM线程

多线程是Java程序有效运行的基础。本章将从线程出现的背景出发,详细阐述线程的优势与安全性问题。接着会从Java内存模型、内存一致性协议、系统内存屏障等多个维度详细阐述如何解决线程安全问题。最后会详细讲解Java线程的创建过程、执行过程与生命周期。

3.1 为什么需要多线程

Linux内核的逻辑架构如图3-1所示。内存管理系统负责引导CPU完成内存数据的读写,虚拟文件系统负责引导CPU完成文件的读写,网络通信系统负责完成数据网络通信。

图3-1 Linux内核逻辑架构

3.1.1 CPU访问各组件周期

由于CPU制造技术越来越先进,其集成度越来越高,运行速度也越来越快,通常指令周期都能达到ns级别。最近20年,相比存储、网络等相关硬件设施在性能上的提升,CPU性能提升非常慢。另外,CPU在访问各个相关设备的时候有很大的差异。CPU访问各硬件的时间如表3-1所示。

表3-1 CPU访问硬件时间

3.1.2 多线程的出现

CPU执行指令与访问内存都比较快,一般耗时在ns级别,但访问的存储与网络设备都非常慢,耗时达到了ms级别。而在应用程序运行时,CPU除了进行运算与内存访问之外,更多是执行磁盘读写、网络访问等I/O操作,如果通过串行化执行应用程序会非常慢。例如,有个进程A需要完成4个任务:任务1是读写文件配置、任务2是打印日志,任务3是网络访问,任务4是显示当前进度。任务1、任务2、任务3都需要300ms,任务4需要200ms。如图3-2所示,如果采用单线程处理,整个任务运行的时长是300×3+200=1100ms,如果采用多线程处理,可以同时处理任务1、任务2、任务3,执行时长是300+200=500ms。

图3-2 多线程处理模型

从程序的角度来看,采用多线程明显提升了应用程序的执行效率。从CPU的角度来看,在相同的时间内完成了更多任务,提高了CPU的使用效率。

那么是否多线程的速度就一定比单线程快呢?未必。Redis就是单线程的,它的性能非常好。因为Redis大量的数据读取与写入都是在内存中完成的,一般操作都会在60ns内完成,所以执行的效率非常高。 DkrWzpxnSWGgAGXXqm5MVg2vy6wXZHx4rtP/ACqK8Od201je0OvoPVowqlbY32Xs

点击中间区域
呼出菜单
上一章
目录
下一章
×