【第二章: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%内容,订阅专栏后可继续查看/也可单篇购买

Java开发岗高频面试题全解析 文章被收录于专栏

<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>

全部评论
死锁的处理策略分为死锁预防,避免死锁,死锁的检测及解除
4 回复 分享
发布于 2020-04-16 13:06
&amp;产生死锁的四个条件&nbsp;&nbsp;&nbsp;资源互斥&nbsp;&nbsp;请求与保持条件&nbsp;&nbsp;不剥夺条件&nbsp;&nbsp;&nbsp;循环等待条件
3 回复 分享
发布于 2020-04-07 15:02
进程通信方式分为低级通信方式和高级通信方式,PV操作为低级通信方式,高级通信方式有管道通信,信息传递,共享存储,共享存储又分为两种,低级方式的共享是基于数据结构的共享,高级方式的共享是基于存储区的共享
2 回复 分享
发布于 2020-04-15 16:42
打卡
1 回复 分享
发布于 2020-03-10 10:48
打卡
1 回复 分享
发布于 2020-02-19 15:10
打卡
1 回复 分享
发布于 2020-02-17 14:56
这个教程质量比某流行面经高挺多的,但是因为篇幅原因吧,感觉更像一个进阶的教程
2 回复 分享
发布于 2020-07-27 12:25
大概多久能更完呀
2 回复 分享
发布于 2019-11-27 12:55
打卡
点赞 回复 分享
发布于 2023-09-07 13:02 河南
打卡,大家有疑问的地方,还是得去看看相关的视频,最好是把视频刷过一遍,做完笔记,然后看看这里面试官会问哪些
点赞 回复 分享
发布于 2021-09-28 11:06
请教下,关于wait()和sleep()区别里,调用sleep()和wait()是会进入等待(WAITING)状态吧?文章都是说阻塞。是写错了吗?
点赞 回复 分享
发布于 2021-02-24 00:21
打卡
点赞 回复 分享
发布于 2021-02-22 11:51
打卡!
点赞 回复 分享
发布于 2020-11-30 09:00
打卡 一刷。
点赞 回复 分享
发布于 2020-09-10 09:18
二刷打卡
点赞 回复 分享
发布于 2020-08-20 11:02
楼主,您好,请问嵌套监视器锁死和死锁中的哲学家吃饭问题有什么区别么
点赞 回复 分享
发布于 2020-08-13 08:10
请问 “可运行状态”和“就绪状态”是一回事儿嘛?
点赞 回复 分享
发布于 2020-06-10 12:04
05/31打卡
点赞 回复 分享
发布于 2020-05-31 13:06
你好,请问线程阻塞的几种状态是否不会重合,比如处于BLOCKED状态就不会处于WAITING状态?
点赞 回复 分享
发布于 2020-05-22 09:59
<span style="color:#333333;">一周之前面试官问了我进程与线程的区别,我记得回答了一句引进线程是为了减少时空开销,增加资源利用率,被hr炮轰问进如何减少时空开销的,最后hr说“进程是资源分配的基本单位;线程是程序执行的基本单位”就可,不必回答其他。</span>
点赞 回复 分享
发布于 2020-04-15 16:15

相关推荐

mjasjon:这种trash中厂 简历过筛概率比大厂还低(除阿里系)
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
03-21 08:46
已编辑
门头沟学院 C++
一个什么都不会的学生:当你有硕士学历的时候HR会说就是比本科生强
点赞 评论 收藏
分享
评论
12
1
分享

创作者周榜

更多
牛客网
牛客企业服务