张治峰的博客

并发应该学习什么

2020-07-20

前言

并发编程的本质(多线程编程)

  • 同步: 线程间的协作
  • 互斥: 独占锁
  • 分工: 大任务拆解

并发学什么

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(八大原则+六条推论)

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章