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


    上下文切换:

    线程使用完时间片,将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. }

  • 相关阅读:
    selenium 元素定位方法
    第八章 排序 一、排序的基本概念
    HTML+CSS大作业【传统文化艺术耍牙15页】学生个人网页设计作品
    产品经理的能力模型是什么?
    PHP毕业设计毕设辅导课(1):PHP 基础语法
    Linux 查看日志
    Applied Time Series Analysis with R
    嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之自动创建节点 (物联技术666)
    【软考 系统架构设计师】案例分析⑥ Web应用系统架构设计
    打印机项目需求
  • 原文地址:https://blog.csdn.net/weixin_43434182/article/details/126071332