【第二章:Java核心技术解析】第8节:Java进阶 - 高效并发编程(上)
大家好,很高兴我们可以继续学习交流Java高频面试题。在前面Java基础篇章中,我们分5个小节,依次介绍了Java基础知识点以及Java中常见的集合知识点。
为了提高程序的运行效率,我们需要合理运用多线程编程。多线程并发编程是我们必不可少的开发技能。所以,面试中对多线程的考察也是不可或缺的。面试中对多线程并发编程的考察,主要针对多线程出现的问题以及如何保证其线程安全,包括但不限于如下的知识点:
- 单线程和多线程,进程与线程的区别
- 线程活性故障及其解决方法
- 线程调度方式
- 可见性,原子性以及有序性
- synchronized,volatile,Atomic等关键字
- 线程池及阻塞队列
- ......
从Java 5.0开始,JDK中提供了java.util.concurrent(简称JUC )包,在此包中增加了并发编程中常用的工具类,用于定义线程的自定义子系统,包括线程池、异步IO 和轻量级任务框架等。
本节是《Java进阶 - 高效并发编程(上)》章节,介绍的知识点包括线程与进程的区别,线程转换状态以及线程活性故障等。让我们以面试题为引,开始学习多线程并发编程知识吧。
(1)进程与线程的区别:(重点掌握)
答:进程与线程之间的主要区别可以总结如下。
- 进程是一个“执行中的程序”,是系统进行资源分配和调度的一个独立单位
- 线程是进程的一个实体,一个进程中一般拥有多个线程。线程之间共享地址空间和其它资源(所以通信和同步等操作,线程比进程更加容易)
- 线程一般不拥有系统资源,但是也有一些必不可少的资源(使用ThreadLocal存储)
- 线程上下文的切换比进程上下文切换要快很多。
线程上下文切换比进程上下文切换快的原因,可以总结如下:
- 进程切换时,涉及到当前进程的CPU环境的保存和新被调度运行进程的CPU环境的设置
- 线程切换时,仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作
解析:
进程与线程的区别算是一个开场题目,旨在考察大家对进程与线程的理解,因为我们的多线程是指在一个进程中的多个线程。
前面我们说线程之间共享一个进程的资源和地址空间,那么线程可以拥有独属于自己的资源吗?
答:可以的,通过ThreadLocal可以存储线程的特有对象,也就是属于当前线程的资源。关于ThreadLocal,我们会在后续小节详细介绍。
既然说到了进程,那么来看下进程之间有哪些通信方式吧。
进程之间常见的通信方式:
- 通过使用套接字Socket来实现不同机器间的进程通信
- 通过映射一段可以被多个进程访问的共享内存来进行通信
- 通过写进程和读进程利用管道进行通信
(2)多线程与单线程的关系:(掌握)
答:多线程与单线程之间的关系可以概括如下。
- 多线程是指在一个进程中,并发执行了多个线程,每个线程都实现了不同的功能
- 在单核CPU中,将CPU分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用CPU的机制。由于CPU轮询的速度非常快,所以看起来像是“同时”在执行一样
- 多线程会存在线程上下文切换,会导致程序执行速度变慢
- 多线程不会提高程序的执行速度,反而会降低速度。但是对于用户来说,可以减少用户的等待响应时间,提高了资源的利用效率
解析:
搞清楚多线程和单线程之间的区别,有助于我们理解为什么要使用多线程并发编程。多线程并发利用了CPU轮询时间片的特点,在一个线程进入阻塞状态时,可以快速切换到其余线程执行其余操作,这有利于提高资源的利用率,最大限度的利用系统提供的处理能力,有效减少了用户的等待响应时间。
但是,多线程并发编程也会带来数据的安全问题,线程之间的竞争也会导致线程死锁和锁死等活性故障。线程之间的上下文切换也会带来额外的开销等问题。
(3)线程的状态有哪些?(掌握)
答:线程的状态包括 新建状态,运行状态,阻塞等待状态和消亡状态。其中阻塞等待状态又分为BLOCKED, WAITING和TIMED_WAITING状态。
解析:
要想准确给出线程的各个状态,我们大可不必看网上的若干个版本的解析。俗话说的好,源码面前没有秘密。我们来看下JDK8中对于Thread状态的枚举定义,所有的状态如下所示:
- NEW
- RUNNABLE
- BLOCKED
- WAITING
- TIMED_WAITING
- TERMINATED
接下来,我们一一看看JDK中解释:
(1)NEW:
看的出来,这是属于一个已经创建的线程,但是还没有调用start方法启动的线程所处的状态。
(2)RUNNABLE:
正如JDK中介绍,该状态包含两种可能。有可能
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>