Java多线程:在看源码之前,更建议掌握的知识

本文深入探讨了Java多线程编程中的并发设计,从程序与系统资源交互、线程与内存CPU的关系到并发设计案例。通过泡茶的例子说明并发方案,强调线程安全和效率提升。学习多线程不应仅关注代码层面,理解软硬件交互有助于全局观的建立。
摘要由CSDN通过智能技术生成

接触Java多线程编程多了后,大家也许会发现,无论是Thread的各种方法、JMM、JVM,还是各种同步、锁等高大上的概念,都是围绕着一个主题去开展的,那就是并发设计。

并发设计则是在指定系统或者单元中,因资源有限出现资源冲突(如CPU、内存),为了解决这些问题让计算机的资源利用率更高、时间更节省而设计了针对性的解决方案,这过程叫并发设计。

一、程序与系统资源的交互

可能上面文字太抽象了,我们先从程序与系统资源的交互入手。了解多线程编程的人,线程涉及最多的是CPU和内存。内存存放我们的程序数据,CPU则给与我们处理数据的运算能力。

那么我们的程序是怎样和两者产生关系的呢?可能学习编程细节前,我们掌握大致流程让我们更有方向性。

1、我们的程序(program),也就是.java文件保持在硬盘中,其由一行行代码(指令)组成。

2、我们在装有jre环境的机器上,通过javac编译成功后得到的.class文件,通过java这个命令生成一个JVM实例,并在其中运行程序,生成一个进程(Process)。

3、JVM实例为进程分配内存空间,把数据(对象)放入到堆内存里面。这时候进程处于等待状态,需要得到CPU时间片才能执行指令。

4、一个进程会有若干个java线程(应用级线程),这些线程也是需要得到CPU使用权限(CPU时间片)才能执行其代码指令的。而线程之间也是轮流运行

5、一个java线程与操作系统级线程(内核线程)进行一一映射,就是说Java线程需要分配给一个内核线程。

6、统筹内核线程和CPU之间的关联的是调度器(scheduler),它也是操作系统的一部分。

7、CPU执行时间被分为非常短的时间片,大概20毫秒。调度器把具体的CPU时间片分配给内核线程,每个CPU时间片只运行一个内核线程。

8、当CPU时间片用完后而该内核线程还在运行的话,调度器将剥夺该内核线程的CPU使用权并分配给其他就绪状态的内核线程。如果CPU时间片内,内核线程工作结束或者进入阻塞,则调度器把剩余的CPU时间片分配给其他内核线程。

 在日常开发中,我们也许更关注程序层面的操作,解决问题以查看代码、java源码以及调试JVM。但是如果我们能超越源码去掌握整个软硬件的交互流程,那么对我们工作或者学习中全局观会更强。

二、线程与内存、CPU

我们知道,当程序运行起来的时候,就生成一个进程,并分配到相应的内存空间(主要是堆内存)。进程内有若干个线程,线程共享堆内存的数据,同时线程也会向堆内存同步数据,这样就产生了线程安全的问题了。因此锁等用于解决多线程并发导致线程不安全的机制也应运而生。

线程是轮流执行的,如何协调CPU时间片内各线程任务完成效率以及正确性是重点。Thread里面的join、sleep等方法就是用于协调各线程间在CPU时间片内任务完成而制定的。

另外就是线程间的切换需要消耗CPU时间,也成为上下文切换时间,减少线程切换以及线程创建和销毁的耗时,也一直在进行优化,如线程池就是其一。

  

三、并发设计案例

 还是以网上比较经典的泡茶例子讲述并发设计的流程。泡茶可以分为三个步骤:煮水(需10分钟),洗茶具(7分钟),泡茶(3分钟)。这就把泡茶这个相对复杂的任务拆解成三个较为独立的三个小任务。

 然后,按一个人去做这三件事,相当于三个线程在等待CPU的使用权。根据前后置关系,煮水、洗茶具必须在泡茶之前,而洗茶具和煮水并没有必然的关联。我们假定煮水的步骤中,只有接水和操作煮水需要人去做,剩下的时间就等炉具把水烧开,假定这步骤需要人的时间为2分钟,剩下八分钟可以去干别的(这个就类似线程sleep了八分钟)。那么我们可以为这次泡茶工作设计如下三套方案:

 以上三种方案都属于并发方案,因为都是以固定的时间去完成任务,只是最后一个体现出并行的效果,从而提升了执行效率和节省时间。

四、结语

结合自己在学习多线程的经历,开始是也是针对特定知识点逐个突破,从了解概念、编码印证、读源码掌握java原生态的方法实现流程。就如下图从外围的做什么(概念)入手,然后去看怎样做(编码),最后才明白为什么这样做。

学了一段时间后,发现多线程的各个主题主要围绕并发设计而定的,在提升效率的同时,并解决内存安全问题以及CPU时间的利用率。也就是从为什么这样做,到怎样做,在归纳这样做属于什么范畴(线程池,锁机制等)。从一个模糊到清晰的过程,理解所作的事情的意义,并为目的去寻找方法,最后得到了一个结果。这就是著名的黄金圈法则,亲身经历的感觉是非常不错的,大家不妨去试下。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值