• 多线程面试题总结


    1.并发编程的三要素:(也是带来线程安全所在)

    原子性:原子是不可再分割的最小单元,原子性是指一个或多个操作要么全部执行成功,要么全部执行失败。
    可见性:一个线程对共享变量的修改,另一个线程能看到(synchronized,volatile)
    有序性:程序的执行顺序按照代码的先后顺序

    线程安全的问题原因有:

     - 线程切换带来的原子性问题
     - 缓存导致的可见性问题
     - 编译优化带来的有序性问题
    
    • 1
    • 2
    • 3

    解决方案:

    • JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
    • synchronized、volatile、LOCK,可以解决可见性问题
    • Happens-Before 规则可以解决有序性问题

    2.线程与进程的区别

    根本区别:进程是操作系统资源分配的基本单元,而线程是处理器任务调度的和执行的基本单位。
    内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。

    线程分类

    分为用户线程与守护线程
    用户(User)线程:运行在前台,执行具体任务,如程序的主线程,连接网络的子线程都是用户线程。必须执行完才会结束。例如,main主线程。
    守护(Daemon)线程:运行在后台,为其它前台线程服务,也可以说守护线程是JVM非守护线程的”佣人“,一旦所有用户线程都执行结束,守护线程会随着JVM一起结束运行。例如,垃圾回收线程。

    3.形成死锁的四个必要条件

    1. 互斥条件:线程(进程)对所分配的资源具有排它性,即一个资源只能被一个进程占用,直到该进程被释放。
    2. 请求与保持条件:一个进程(线程)因请求被占有资源而发生堵塞时,对已获取的资源保持不放。
    3. 不剥夺条件:线程(进程)已获取的资源在未使用完之前不能被其他线程强行剥夺,只有等自己使用完才释放资源。
    4. 循环等待条件:当发生死锁时,所等待的线程(进程)必定形成一个环路,死循环造成永久堵塞。

    4.如何避免死锁

    只需破坏形参死锁的四个必要条件之一即可。

    1. 破坏互斥条件:无法破坏,我们的🔒本身就是来个线程(进程)来产生互斥
    2. 破坏请求与保持条件:一次申请所有资源
    3. 破坏不剥夺条件:占有部分资源的线程尝试申请其它资源,如果申请不到,可以主动释放它占有的资源。
    4. 破坏循环等待条件:按序来申请资源。

    5.什么是上下文的切换

    当前任务执行完,CPU时间片切换到另一个任务之前会保存自己的状态,以便下次再切换会这个任务时可以继续执行下去,任务从保存到再加载执行就是一次上下文切换。

  • 相关阅读:
    (附源码)计算机毕业设计ssmJAVA高校田径运动会管理
    数字藏品NFT“无聊猿”BAYC的内忧与外患
    每日一面系列之@Component和@Configuration区别
    【计算机组成原理】读书笔记第二期:使用有棱有角的内存
    聊聊测试的右移
    mysql查询排名
    ps 命令 快捷键 知识点汇总
    Python:实现logistic regression逻辑回归算法(附完整源码)
    Inno Setup 打包脚本笔记
    TypeScript 实践中的 Equals 类型的实现原理是什么?
  • 原文地址:https://blog.csdn.net/qq_38477936/article/details/125540749