打算复习一遍高并发相关的知识,因此在这里做一个简单的笔记。
本篇博文都是比较基础的概念,而且比较简要,大家如果要深入理解,尽量多看一些高并发相关的书籍,如果才刚接触这一块的同学,建议学习《java并发编程从入门到精通》,这一本书入门还是很不错的!
这里接着上一篇博文继续写!
一、阻塞队列
1.阻塞队列理解
举例:例如餐饮店顾客满了以后,有让顾客等待的地方,等待则阻塞
队列满了,生产者阻塞
队列空了,消费者阻塞
2. BolckQueue接口
BolckQueue接口继承了Collection接口,与List同级
BolckQueue接口的子类又有7个
重点是红色的3个,构成了线程池的底层
3.升生产者消费者级过程
以前学的是生产者消费者1.0,使用的是synchronized,wait(),notify()
这里学了个生产者消费者2.0,使用的是Lock,await(),signalAll()
后面学生产者消费者3.0,使用的是阻塞队列
4. synchronized和Lock的区别
1.synchronized是Java关键字,而Lock是API类
2.前者不用手动释放,后者需要
3.前者不可中断,后者可以中断
4.前者是非公平锁,后者可以是公平锁也可以是非公平锁,默认非公平,可以自定义设置
二、线程池
1.创建线程到底有几种方式?
四种!
1.继承Thread
2.实现Runnalbe接口
3.实现Callable接口
4.通过线程池创建线程
2. Callable接口和Runnalbe接口实现线程的区别?
通过Callable接口实现线程,有返回值,而且可以抛出异常
3.线程池
线程池含义:将多个线程维护在一个容器中。需要创建线程的时候,直接从容器中取。
作用:控制运行线程的数量、线程复用、控制最大并发数、管理线程。
4.创建线程池的五种方法,前三种最为重要
1.Executors.newFixedThreadPool(int);创建固定大小的线程池
2.Executors.newSingleThreadExecutor();创建只含一个线程的线程池
3.Executors.newCachedThreadPool();创建一个带缓冲区的线程池,线程池的数量能够根据实际需求自动调节。
4.Executors.newScheduledThreadPool()带调度的,设定一个时间参数,池子中的请求每隔一段时间执行一次
5.Executors.newWorkStealingPool是java8新增
这三个线程底层都是用的new ThreadPoolExecutor,因此线程池最核心的类是:ThreadPoolExecutor
5.线程池的七大参数
(上接图片)如何来拒绝接受线程。
6.四种拒绝策略
7.线程池的工作原理
8.死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。
JDK开发命令来观察死锁:
jps -l定位进程号
jstack,看具体原因,会发现是死锁