没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1、 从 0 开始深入理解并发、线程与等
待通知机制
为什么我们要学习并发编程?
最直白的原因,因为面试需要,我们来看看阿里和美团对 Java 岗位的 JD:
从上面两大互联网公司的招聘需求可以看到,大厂的 Java 岗的并发编程能
力属于标配。
而在非大厂的公司,并发编程能力也是面试的极大加分项,而工作时善用并
发编程则可以极大提升程序员在公司的技术话语权。
为什么开发中需要并发编程?
从阿里的岗位 JD 其实就能看出来,并发编程和性能优化是密切相关的,使
用并发编程可以做到:
(1)加快响应用户的时间
比如我们经常用的迅雷下载,都喜欢多开几个线程去下载,谁都不愿意用一个
线程去下载,为什么呢?答案很简单,就是多个线程下载快啊。
我们在做程序开发的时候更应该如此,特别是我们做互联网项目,网页的响应
时间若提升 1s,如果流量大的话,就能增加不少转换量。做过高性能 web 前端调优
的都知道,要将静态资源地址用两三个子域名去加载,为什么?因为每多一个子域
名,浏览器在加载你的页面的时候就会多开几个线程去加载你的页面资源,提升网
站的响应速度。
(2)使你的代码模块化,异步化,简单化
例如我们实现电商系统,下订单和给用户发送短信、邮件就可以进行拆分,
将给用户发送短信、邮件这两个步骤独立为单独的模块,并交给其他线程去执行。
这样既增加了异步的操作,提升了系统性能,又使程序模块化,清晰化和简单化。
多线程应用开发的好处还有很多,大家在日后的代码编写过程中可以慢慢体
会它的魅力。
(3)充分利用 CPU 的资源
目前市面上没有 CPU 的内核不是多核的,比如这台机器
多核下如果还是使用单线程的技术做思路明显就 out 了,无法充分利用 CPU
的多核特点。如果设计一个多线程的程序的话,那它就可以同时在多个 CPU 的多
个核的多个线程上跑,可以充分地利用 CPU,减少 CPU 的空闲时间,发挥它的运算
能力,提高并发量。
就像我们平时坐地铁一样,很多人坐长线地铁的时候都在认真看书,而不是为
了坐地铁而坐地铁,到家了再去看书,这样你的时间就相当于有了两倍。这就是为
什么有些人时间很充裕,而有些人老是说没时间的一个原因,工作也是这样,有的
时候可以并发地去做几件事情,充分利用我们的时间,CPU 也是一样,也要充分利
用。
当然有同学会有疑问,单核 CPU 呢?单核 CPU 一样可以利用到并发编程的
好处吗?当然可以,用我们平时常用的 QQ 之类的聊天程序来举例,当我们用
QQ 聊天时,其实程序要做好几件事,比如:接受我们的键盘输入,把输入的信
息通过网络发给对方,接受对方通过网络发来的信息,把对方的信息显示在屏幕
上,很多的时候,这些事情是可以同时发生的。如果程序不能利用并发编程同时
处理,我们和对方的通话就只能一问一答的方式进行了。
我们怎么学并发编程?
课程章节安排如下:
1、从 0 开始深入理解并发、线程与等待通知机制
2、导致 JVM 内存泄露的 ThreadLocal 详解
3、并发编程之 CAS&Atomic 原子操作详解
4、一节课学透面试必问并发安全问题
5、JUC 并发工具类在大厂的应用场景详解
6、深入理解 AQS 之 ReentrantLock 源码分析
7、ReentrantReadWriteLock&StampLock 详解
8、并发容器(Map、List、Set)实战及其原理
9、阻塞队列 BlockingQueue 实战及其原理分析
10、线程池 ThreadPoolExecutor 实战及其原理分析
11、线程池 ForkJoinPool 工作原理分析
12、深入理解并发可见性、有序性、原子性与 JMM 内存模型
13、CPU 缓存架构详解&高性能内存队列 Disruptor 实战
14、常用并发设计模式精讲
可以看到并发编程的课时其实是相当多的,反过来也说明并发编程在 Java
程序员的技能栈中重要地位。
对于没有或者很少接触并发编程的同学,建议主要掌握并发里的基础概念、
基础用法和并发工具类、并发容器的用法,章节主要对应第 1 ~ 5 章、第 8、9、
10、11。对于已经有较多并发编程经验建议全部学习,synchronized 底层原理则
以知识小节的视频方式单独提供。
注意:以上的章节和授课顺序是根据并发编程本身的知识结构和人类学习的
认知机制设计安排的,和具体授课时的课程数、课程标题可能存在一定的不匹配
情况,因此出现一节课讲述多个章节和一个章节跨越多节课属于正常现象。
基础概念
在正式学习 Java 的并发编程之前,还有几个并发编程的基础概念我们需要
熟悉和学习。
进程和线程
进程
我们常听说的是应用程序,也就是 app,由指令和数据组成。但是当我们不
运行一个具体的 app 时,这些应用程序就是放在磁盘(也包括 U 盘、远程网络
存储等等)上的一些二进制的代码。一旦我们运行这些应用程序,指令要运行,
数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中
还需要用到磁盘、网络等设备,从这种角度来说,进程就是用来加载指令、管理
内存、管理 IO 的。
当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个
进程。
进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程
(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如
网易云音乐、360 安全卫士等)。显然,程序是死的、静态的,进程是活的、动态
的。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进
程就是系统进程,它们就是处于运行状态下的操作系统本身,用户进程就是所有由
你启动的进程。
站在操作系统的角度,进程是程序运行资源分配(以内存为主)的最小单位。
线程
一个机器中肯定会运行很多的程序,CPU 又是有限的,怎么让有限的 CPU
运行这么多程序呢?就需要一种机制在程序之间进行协调,也就所谓 CPU 调度。
线程则是 CPU 调度的最小单位。
线程必须依赖于进程而存在,线程是进程中的一个实体,是 CPU 调度和分
派的基本单位,它是比进程更小的、能独立运行的基本单位。线程自己基本上不
拥有系统资源,,只 拥有在运行中必不可少的资源(如程序计数器,一组寄存器和栈),
但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个进程可
以拥有多个线程,一个线程必须有一个父进程。线程,有时也被称为轻量级进程
(Lightweight Process,LWP),早期 Linux 的线程实现几乎就是复用的进程,后来
才独立出自己的 API。
Java 线程的无处不在
Java 中不管任何程序都必须启动一个 main 函数的主线程; Java Web 开发里
面的定时任务、定时器、JSP 和 Servlet、异步消息处理机制,远程访问接口 RM 等,
任何一个监听事件,onclick 的触发事件等都离不开线程和并发的知识。
大厂面试题:进程间的通信
同一台计算机的进程通信称为 IPC(Inter-process communication),不同计
算机之间的进程通信被称为 R(mote)PC,需要通过网络,并遵守共同的协议,比
如大家熟悉的 Dubbo 就是一个 RPC 框架,而 Http 协议也经常用在 RPC 上,比如
SpringCloud 微服务。
大厂常见的面试题就是,进程间通信有几种方式?
1. 管道,分为匿名管道(pipe)及命名管道(named pipe):匿名管道可用
于具有亲缘关系的父子进程间的通信,命名管道除了具有管道所具有的功能外,
它还允许无亲缘关系进程间的通信。
2. 信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较
复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器
收到一个中断请求效果上可以说是一致的。
3. 消息队列(message queue):消息队列是消息的链接表,它克服了上两
种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息
队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。
剩余31页未读,继续阅读
资源评论
代码匠心印记
- 粉丝: 483
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功