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

  • 相关阅读:
    windows-如何免费让电脑自带的家庭中文版升级成专业版且不需要重装
    服务器管理-windows服务器如果让服务器自动定时重启
    International Olympiad In Informatics 2009 August 8 – 15, Plovdiv, Bulgaria Contest Day 1
    USACO 2008 FEB Eating Together
    POJ 2823 Sliding Window 滑动窗口 单调队列 Monotone Queue
    1st Junior Balkan Olympiad in Informatics Boats 船 DP
    USACO 2009 FEB Fair Shuttle 庙会班车 贪心
    USACO 2007 NOV Sunscreen 防晒霜 贪心
    JN 刷墙 过程DP
    Luogu
  • 原文地址:https://www.cnblogs.com/mrxy/p/6477584.html
Copyright © 2011-2022 走看看