• 上下文切换、产生死锁条件及解决、守护线程


    上下文切换:

    线程使用完时间片,将cpu资源让给其他线程

    线程死锁:两个或以上线程,因争夺资源而相互等待的现象

    产生死锁条件:

    1. 互斥条件:资源同一时刻只能被同一线程占用
    2. 请求并持有条件:线程已持有资源,又需要其他资源,得不到又不释放已有资源
    3. 不可剥夺条件:资源在自己使用完之前,不能被其他线程占用
    4. 环路等待条件:资源-线程,形成环形链

    案例:资源-线程,形成环形链 

    演示产生死锁
    1. package deadLockP;
    2. public class DeadLockL {
    3. private final static Object resourceA = new Object();
    4. private final static Object resourceB = new Object();
    5. public static void main(String[] args) {
    6. Thread threadA = new Thread(new Runnable() {
    7. @Override
    8. public void run() {
    9. System.out.println("threadA get resourceA");
    10. synchronized (resourceA) {
    11. try {
    12. Thread.sleep(1000);
    13. System.out.println("threadA try to get resourceB");
    14. synchronized (resourceB) {
    15. System.out.println("threadA get resourceB");
    16. }
    17. } catch (InterruptedException e) {
    18. throw new RuntimeException(e);
    19. }
    20. }
    21. }
    22. });
    23. Thread threadB = new Thread(new Runnable() {
    24. @Override
    25. public void run() {
    26. System.out.println("threadB get resourceB");
    27. synchronized (resourceB) {
    28. try {
    29. Thread.sleep(1000);
    30. System.out.println("threadB try to get resourceA");
    31. synchronized (resourceA) {
    32. System.out.println("threadB get resourceA");
    33. }
    34. } catch (InterruptedException e) {
    35. throw new RuntimeException(e);
    36. }
    37. }
    38. }
    39. });
    40. threadA.start();
    41. threadB.start();
    42. }
    43. }

    result:

    解决: 

    线程B也改为获取资源A,B的顺序

    避免死锁:

    1. 破坏请求并持有条件
    2. 破坏环路等待条件

    守护线程与用户线程

    举例JVM退出
    用户线程main线程需要等待所有用户线程结束
    守护线程垃圾回收线程不考虑守护线程是否结束

    如何设置线程为守护线程(自己默认创建为用户线程)

    1. /**
    2. * 设置为守护线程
    3. */
    4. public class DemonTest {
    5. public static void main(String[] args) {
    6. Thread daemonThread = new Thread(new Runnable() {
    7. @Override
    8. public void run() {
    9. }
    10. });
    11. // 设置为守护线程
    12. daemonThread.setDaemon(true);
    13. }
    14. }

  • 相关阅读:
    XML 工具类
    Kafka核心组件详解
    DolphinScheduler 1.x使用经验篇及bug解决篇
    SwiftUI 动态岛开发教程之什么是Dynamic Island,快速完整demo
    基于安卓android微信小程序的远景民宿预订小程序
    【面试题】马上金九银十了,简历该准备起来了,面试题你准备好了吗 ?浅谈 JS 浅拷贝和深拷贝
    JDBC的基本使用(mysql与java)
    【Segment Anything Model】SAM做多类别分割,医疗语义分割
    维格云小程序如何快速上手开发?
    CAD .NET 14.1.X DWG/ DXF, PLT 自由转换- CNC
  • 原文地址:https://blog.csdn.net/weixin_43434182/article/details/126071332