zoukankan      html  css  js  c++  java
  • 解决线程死锁问题

    在编写多线程程序时,必须注意资源的使用问题。如果两个线程(多个线程时情况类似)分别拥有不同的资源,而同时又需要对方释放资源才能继续运行时,就会发生死锁。本实例演示了一种解决死锁的方式,实例运行效果如图

    编写类DeadLock,该类实现了Runnable接口。在run()方法中,由于去掉了一个同步块而解决了线程的死锁问题。代码如下:

    package com.mingrisoft.thread;
    
    public class DeadLock implements Runnable {
        private boolean flag;// 使用flag变量作为进入不同块的标志
        private static final Object o1 = new Object();
        private static final Object o2 = new Object();
        
        public void run() {
            String threadName = Thread.currentThread().getName();// 获得当前线程的名字
            System.out.println(threadName + ": flag = " + flag);// 输出当前线程的flag变量值
            if (flag == true) {
                synchronized (o1) {// 为o1加锁
                    try {
                        Thread.sleep(1000);// 线程休眠1秒钟
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(threadName + "进入同步块o1准备进入o2");// 显示进入o1块
                    System.out.println(threadName + "已经进入同步块o2");// 显示进入o2块
                }
                if (flag == false) {
                    synchronized (o2) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(threadName + "进入同步块o2准备进入o1");// 显示进入o2块
                        synchronized (o1) {
                            System.out.println(threadName + "已经进入同步块o1");// 显示进入o1块
                        }
                    }
                }
            }
        }
        
        public static void main(String[] args) {
            DeadLock d1 = new DeadLock();// 创建DeadLock对象d1
            DeadLock d2 = new DeadLock();// 创建DeadLock对象d2
            d1.flag = true; // 将d1的flag设置为true
            d2.flag = false; // 将d2的flag设置为false
            new Thread(d1).start();// 在新线程中运行d1的run()方法
            new Thread(d2).start();// 在新线程中运行d2的run()方法
        }
    }
    

      

    心法领悟:解决死锁的方法。

    当具备以下4个条件时,就会产生死锁:资源互斥(资源只能供一个线程使用)、请求保持(拥有资源的线程在请求新的资源又不释放占有的资源)、不能剥夺(已经获得的资源在使用完成前不能剥夺)和循环等待(各个线程对资源的需求构成一个循环)。通常破坏循环等待是最有效的方法。

  • 相关阅读:
    确认端口占用
    [转]自建Syncthing中继服务器(私密传输或造福大众)
    【转】Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置
    【转】搭建和配置Syncthing发现和中继服务器
    【转】Syncthing的安装与使用
    pycrypto安装出错的问题 intmax_t C:Program Files (x86)Windows Kits10include10.0.10240.0ucrtinttypes.
    Git从库中移除已删除大文件
    词云图
    [转].NET 性能测试工具 -- 事件跟踪器(ETW)
    [转]ANTS Performance Profiler和ANTS Memory Profiler 使用
  • 原文地址:https://www.cnblogs.com/mrxy/p/6477584.html
Copyright © 2011-2022 走看看