看完后,你再也不用怕面试问并发编程啦

引言为什么很多大厂喜欢问并发编程呢?因为并发编程是开发人员的一个分水岭 。很多好几年开发经验的开发人员可能也没有实际的并发编程经验,要么就是在一些没有挑战性的中台实现了所谓的分布式锁,但是没有并发量去考验,要么就是笑着说其实工作中用不上,这些开发人员后面会逐渐被AI淘汰 , CURD的东西花这么多钱请你们干嘛呢?为什么不直接请个便宜的应届生呢?锻炼一两年绝对不比这些开发人员差 。因此,努力越过分水岭,往架构组件的能力出发吧 。这篇文章将会是你的出发点,这里会详细介绍JDK 的并发包的原理及使用方法 。1、JUC并发编程概述J.U.C并发包,即JAVA.util.concurrent包,是JDK的核心工具包,是JDK1.5之后,由 Doug Lea实现并引入 。
整个java.util.concurrent包,按照功能可以大致划分如下:

  • juc-locks 锁框架
  • juc-atomic 原子类框架
  • juc-sync 同步器框架、工具类
  • juc-collections 集合框架
课程J.U.C,分析所有基于的源码为Oracle JDK1.82、多线程基?。航?獭⑾叱?/h3>多线程概念介绍
  • 进程:我们把运行中的程序叫做进程(概念) 。每个进程都会占用内存与CPU资源(动态性) 。进程与进程之间各自占用各自的内存资源 , 互相独立(独立性) 。
  • 线程:线程就是进程中的一个执行单元,负责当前进程中程序的执行 。一个进程可以包含多个线程 。一个进程包含了多个线程就是多线程 。多线程可以提高程序的并行运行效率 。
     线程简述: 线程是进程的执行单元 , 用来执行代码 。
为什么使用多线程?
多线程有什么用?这里举例说明:
比如看学习视频时候:我们在看视频的同时,还可以听到声音,还可以看到广告以及弹幕 , 这里至少用到四个线程,当其中一个线程卡死如放不了弹幕不影响播放广告 。
看完后,你再也不用怕面试问并发编程啦

文章插图
如上图,要达到并行执行的效果 , 这里就要用到多线程 。
  • 并行: 两个或两个以上的事件在同一时刻发生(同时发生)
  • 并发: 两个或两个以上的事件在一个时间段内发生(交替执行)
线程调度
计算机通常只有一个CPU时,在任意时刻只能执行一条计算机指令,每一个进程只有获得CPU的使用权才能执行指令 。所谓多进程并发运行,从宏观上看 , 其实是各个进程轮流获得CPU的使用权,分别执行各自的任务 。那么,就会有多个线程处于就绪状态等到CPU , JVM就负责了线程的调度 。JVM采用的是抢占式调度,没有采用分时调度,因此可能造成多线程执行结果的的随机性 。
说明:在单核CPU中 , 同一个时刻只有一个线程执行,根据CPU时间片算法依次为每个线程服务 , 这就叫线程调度 。3、多线程编程:wait()、notify()、notifyAll()目标: 线程等待和唤醒使用 。
介绍
等待和唤醒:通常是两个线程之间的事情,一个线程等待,另外一个线程负责唤醒
等待和唤醒
  • wait() 等待
  • notity() 唤醒单个
  • notityAll() 唤醒全部
Object类:【看完后,你再也不用怕面试问并发编程啦】public final void wait();// 导致当前线程等待public final native void wait(long timeout) throws InterruptedException;public final native void notify();// 唤醒正在等待的单个线程public final native void notifyAll(); // 唤醒正在等待的全部线程 注意:wait和notify必须是在同步代码块中,使用锁对象调用
  • wait()方法的作用?
     使当前线程阻塞
  • notify()方法的作用?
     唤醒正在等待的单个线程
  • notifyAll()方法的作用?
     唤醒所有等待(对象的)线程 , 哪一个线程将会第一个处理取决于操作系统的实现 。
  • 为什么wait和notify方法放在Object?
     因为wait和notify需要使用锁对象来调用,而任何对象都可以作为锁,所以放在Object类中 。
  • 详细介绍
1、wait()、notify()、notifyAll() 方法是Object的本地final方法,子类无法被重写 。


推荐阅读