多线程的相关知识点

12.死锁

死锁的四个条件:
互斥:
资源x在任意时刻只能被一个线程持有
占有且等待:
线程1占有资源x的同时等待资源y,并不释放x
不可抢占:
资源x一旦被线程1占有后,其他线程不能抢占资源x
循环等待:
线程1持有x,等待y;线程2持有y,等待x
死锁产生的原因:以上四个原因同时满足
synchronized如何来解决死锁?
以上四个条件都不能破坏,因此产生Lock。

13.JDK1.5 Lock体系【接口】

使用格式:搭配

try{
//同步代码块、显示加锁
Lock.lock();
}catch(Exception e){
}finally{
//显示解锁
lock.unlock();
}

常用方法
线程停止三个方法:(1)stop()
(2)设置标记位
(3)interrupt()
lock():加锁,语义与synchronized完全一致
unlock():解锁
(1)void lockInterruptiblity()throw InterruptdException:响应中断加锁【不可抢占抛开】
(2)boolean tryLock():非阻塞获取锁,获取锁成功返回true,进入同步块;获取锁失败返回false,线程继续执行其他的代码。【占有且等待抛开】
(3)boolean tryLock(long time,TimeUnit unit)throw InterruptdException:支持超时【不可抢占、占有且等待抛开】

14.synchronized与ReentrantLock的关系与区别?

关系:
1.都属于独占锁(任意一个时刻只有一个线程能获取到资源)的实现
2.都支持可重入锁
区别:
(1)synchronized是关键字,JVM层面实现;
ReentrantLock是Java语言层面实现的“管程”。
(2)ReentrantLock具备一些synchronized不具备的功能:响应中断、非阻塞式中断、支持超时获取锁、支持公平锁、支持多个等待队列。
公平锁:等待时间最长的线程最先获取到锁。

15.线程的等待与唤醒机制(线程通信方法之一)

wait/notify:synchronized
调用notify后,将等待队列的线程唤醒置入同步队列末尾排队获取锁
notify线程直到将自己的同步块执行完毕后才会释放锁
任意一个Monitor有一个同步队列和一个等待队列(生产、消费都进入一个队列)
只有一个等待队列时,唤醒所有线程会造成不该唤醒的线程又被唤醒然后再次阻塞,造成性能开销。
notifyAll()->所有线程都唤醒(包含消费者)

await/signal:Lock
Condition:等待队列模型
任意一个Lock对象有一个同步队列和多个等待队列(Lock.condition())
Lock体系下另外一个子类:ReentrantReadWriteLock[可重入的读写锁]
独占锁:
任意一个时刻只有一个线程能获取到资源
共享锁:
任意一个时刻有多个线程可以获取锁
读写锁:
读锁:共享锁,读线程与读线程是异步,可以同时获取到锁
写锁:独占锁,写线程与写线程互斥,只有一个写者可以获取到锁
读写互斥、写写互斥
读锁==无锁?一定不等
写线程开始工作时,可以限制所有读线程阻塞
缓冲:Map
HashMap+ReentrantReadWriteLock=高效线程Map
JDK1.8 StampLock

16.juc 四大并发工具类

juc.CountDownLatch 闭锁
一个线程等待一组线程执行完毕后在恢复执行
await():等待其他线程都执行完毕
cutDown():被等待线程执行完毕后将计数器减一
当CountDownLatch值减为0时无法恢复[计数器无法恢复]
juc.CyclicBarrier:循环栅栏
一组线程同时到达临界点后同时恢复执行(先到达临界点的线程会阻塞,直到所有线程都到达临界点)
当多个线程同时到达临界点时,随机挑选一个线程执行barrierAction后再同时恢复执行
多线程向磁盘写入数据[计数器可以恢复]
juc.Exchanger:线程交换器
用于两个线程之间数据交换,当Exchanger只有一个线程时,该线程会阻塞直到有别的线程调用Exchanger进入缓存区,当前线程与新线程交换数据后同时恢复执行。
juc.Semaphore:信号量
acquire():尝试占用一个信号量,失败的线程会阻塞直到有新的信号量
release():释放一个占有的信号量
acquire(int n):尝试占用n个信号量,失败的线程会阻塞直到有新的信号量
release(int n):释放n个占有的信号量
TreadLocal:线程本地变量

17.线程池

为啥要采用线程池?
【优点】方便管理与监控线程的状态、提高任务响应速度、线程可以重复执行任务
数据库连接池Druid、C3p0、Hakari
数据源DataSource
ExecutorService:普通调度池接口
submit——(Runnable||Callable):Future
execute——(Runnable):void
子接口ScheduleExecutorService:定时调度池(可以执行定时任务)
TreadPoolExecutor:线程池核心实现类
Executors:线程池工具类
线程池的工作流程:当任务到达线程池时的工作顺序
核心线程池corePoolSize、阻塞队列BlockingQueue、最大线程池maxiumPoolSize、拒绝策略rejectHandler

(1)若核心池未满,则创建新的线程执行任务而后将此线程入核心池。若核心池满且有空闲线程,调度空闲线程执行任务。
(2)将任务置入阻塞队列,排队等待空闲线程调度
ArrayBlockQueue:基于数组的有界阻塞队列
LinkedBlockingQueue:基于链表的无界阻塞队列
SynchrousQueue:不存储元素的无界阻塞队列
(3)当阻塞队列满时,若此时最大线程池未满,创建新线程执行任务而后置入最大线程池中
(4)若最大线程池已满,调用相应的拒绝策略处理任务(默认为抛出异常且不处理任务)
手工创建线程池
Thread类执行Callable FutureTask
FutureTask类保证多线程场景下任务只被执行1次
Future get()会阻塞当前线程直到取得Callable的返回值

18.JDK内置的四大线程池(Exectors)

(1)固定大小线程池:LinkedBlockQueue[核心线程池与最大线程池数目相同]

  return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockQueue<Runnable>());

应用场景:当服务器负载较重时,限制线程的数量,可以采用固定大小线程池
(2)单线程池:newSingleThreadExecutor
应用场景:某些需要同步处理的场合(任务需要按序处理)

 return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));

(3)缓存线程池:newCachedThreadPool
应用场景:适用于负载较轻的服务器,适用于很多短期的小任务

 return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());

(4)定时调度池:newScheduledThreadPool
应用场景:需要执行定时任务的场合

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) {return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);}

SynchronousQueue:不存储元素
入队与出队操作必须同时调用
提交任务速度>执行任务速度:不断创建新线程执行任务,有可能会将内存写满
提交任务速度<执行任务速度:固定的几个线程来处理任务
线程池:工作流程、ThreadPoolExecutor参数会配置(自定义线程)、内置四大线程池使用场景

多线程的相关知识点(下)相关推荐

  1. 并发与多线程相关知识点梳理

    文章目录 并发和并行的概念 如何保证线程安全 1. 数据单线程内可见 2. 只读对象 3. 线程安全类 4. 同步与锁机制 什么是锁 线程同步 引用类型 ThreadLocal LeetCode 相关 ...

  2. 多线程相关知识点总结

    多线程相关知识点总结 1. 线程的概念: 在早期的操作系统中并没有线程的概念,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位.任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的 ...

  3. Java虚拟机垃圾回收相关知识点全梳理(下)

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 上一篇文章<Java虚拟机垃圾回收相关知识点全梳理(上)>我整理分享了JVM运行时数据区域的划分,垃圾判 ...

  4. labview csv文件处理_LabVIEW 相关知识点分类汇总

    题图照片:Photo by Pixabay from Pexels 为了在知乎和小伙伴们一起更好进行LabVIEW相关知识与技术的讨论,特此制作了本知识点分类汇总供大家参考,分类采用先分块后分层的分而 ...

  5. ArrayList源码解析与相关知识点

    ArrayList源码解析于相关知识点(超级详细) 文章目录 ArrayList源码解析于相关知识点(超级详细) ArrayList的继承关系 Serializable标记接口 Cloneable标记 ...

  6. ESB(企业服务总线)相关知识点总结

    目录 一.什么是ESB 二.ESB解决了什么问题以及什么是HSB 三.市面上 ESB产品有哪些?如何选择 四. 如何实现ESB的各个功能 1.ESB的服务接入方式? 2.ESB的如何进行协议转换? 3 ...

  7. Redis 相关知识点

    Redis 相关知识点 概述 为什么要用缓存 为什么用redis 用redis缓存了哪些东西 单线程redis为什么这么快 redis的数据类型和使用场景 redis 的过期策略都有哪些?内存淘汰机制 ...

  8. redis相关知识点讲解,redis面试题

    redis相关知识点讲解,redis面试题 1. redis基本知识点 1.1 什么是redis? 1.2 redis的key的设计 1.3 redis的value数据类型有哪些? 1.3.1 str ...

  9. 卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)

    来源:轨道机动算法的C++实现_shirro123的专栏-CSDN博客 卫星轨道推演计算相关基础知识点总结 一.卫星的运动特性             二.卫星的空间坐标系               ...

最新文章

  1. get请求乱码问题,用encodeURI和decodeURI
  2. deepblueai
  3. 当代家长现状。。 | 今日最佳
  4. 小米手机硬改技术_小米11手机爆料:首发骁龙875 或采用屏下摄像头技术
  5. Head First 设计模式--1策略模式 组合优于继承
  6. LDA(Latent Dirichlet Allocation)简介
  7. 阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例
  8. OCP考试题库(精准无比)
  9. piano+apk+android,PianOli | F-Droid - Free and Open Source Android App Repository
  10. Windows bat批处理常用指令,常用指令及语法总结
  11. 银盒子·序列号购买(2018-12-05)
  12. 移动磁盘拒绝访问要如何办啊
  13. 【渝粤题库】陕西师范大学163104 景区管理 作业 (高起专)
  14. 滴滴全线业务优化,芭比Q 了?
  15. P2E游戏+保护濒危动物是否值得一玩,链游Pettoverse全面分析
  16. Revit空闲事件(Idling Event)增强和外部事件(External Event)
  17. 触须避障程序(改进篇)
  18. 不用手机的群控,什么原理
  19. 矩阵求逆引理(matrix inversion lemma)
  20. python实现电话号码映射

热门文章

  1. docker启动redis、并加载配置文件
  2. 人类为什么活得这么累?Nature论文解开谜底:人总是选择做加法来解决问题
  3. Arcgis api for Javascript + arcgisServer + arcSDE笔记(1)
  4. 如何在Java中正确使用Apache Commons数学库中的ZipfDistribution?
  5. 程序员面试指北(一)
  6. 【前端修炼之路】第一话 · 初识前端领域
  7. 题目:输入一个数,判断它是不是回文数。一个数从左边读和从右边读的结果是一模一样的话就是回文数,例如12321是回文数,12531不是回文数。
  8. Github推荐:超好用的全开源协同OA项目
  9. 群晖DSM7.X Video Station结合FFMPEG支持DTS视频及EAC3音频编码
  10. java毕业设计大型商场应急预案管理系统mybatis+源码+调试部署+系统+数据库+lw