前言
并发编程的本质(多线程编程)
- 同步: 线程间的协作
- 互斥: 独占锁
- 分工: 大任务拆解
并发学什么
1. JMM模型 java线程内存模型
- 特性:原子性、有序性、可见性
- 硬件:机械同感
2. 线程 内核级线程
2.1 new Thread() 和普通对象的区别?
thread.start() 是本地方法即调用JVM的c++方法
2.2 为什么java 线程是内核级线程
-JVM不具有调度CPU的权限 new Thread()只是一个java对象start() 实际调用操作系统中p_thread方法。java 线程只是作用与线程绑定.过程为javaThread–osThread–内核线程(p_thread)
2.3 线程池-线程复用
由于java线程需要与内核线程进行绑定,创建、连接、销毁都损性能,所以线程池就是为了减少开销提升性能。
2.4 锁机制 (加锁是为了序列化的访问临界资源
JVM内置锁: synchronized,包含四种状态 无锁、偏向锁、轻量级锁、重量级锁。(锁膨胀过程、object monitor 机制)
JUC包: 独占锁、共享锁、读写锁,公平锁、非公平锁(AQS)
等待唤醒机制(wait/notify、park/unpark
2.5 工具类&并发容器
2.6 并行 (forkjoin
2.7 并发设计模式
不变性、copyonwrite
等待唤醒机制
生产者消费者模式
并发的风险
性能问题: 上下文频繁切换
线程切换是时候需要对线程1的状态进行保存例如 程序执行的行号、变量值等,而线程2需要恢复线程上一次获取到cpu的执行状态
活跃性问题
死锁: 线程相互等待。例子 面试官问:你给我解释下死锁。你答:你录取我我就告诉你。
活锁: 线程相互谦让。例子 过马路,你迎面遇到一辆车,两个人相互让道,但每次都没让开。
饥饿: 一个线程执行时优先级高 反复获取资源导致其他线程不能执行
线程安全
加锁、三大特性、happens-before(八大原则+六条推论)
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章