在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

解决线程死锁问题

2017-3-7 12:52| 发布者: zhangjf| 查看: 1433| 评论: 0

摘要: 在编写多线程程序时,必须注意资源的使用问题。如果两个线程(多个线程时情况类似)分别拥有不同的资源,而同时又需要对方释放资源才能继续运行时,就会发生死锁。本实例演示了一种解决死锁的方式,实例运行效果如图 ...
    在编写多线程程序时,必须注意资源的使用问题。如果两个线程(多个线程时情况类似)分别拥有不同的资源,而同时又需要对方释放资源才能继续运行时,就会发生死锁。本实例演示了一种解决死锁的方式,实例运行效果如图
编写类DeadLock,该类实现了Runnable接口。在run()方法中,由于去掉了一个同步块而解决了线程的死锁问题。代码如下:
  1. package com.mingrisoft.thread;

  2. public class DeadLock implements Runnable {
  3.     private boolean flag;// 使用flag变量作为进入不同块的标志
  4.     private static final Object o1 = new Object();
  5.     private static final Object o2 = new Object();
  6.    
  7.     public void run() {
  8.         String threadName = Thread.currentThread().getName();// 获得当前线程的名字
  9.         System.out.println(threadName + ": flag = " + flag);// 输出当前线程的flag变量值
  10.         if (flag == true) {
  11.             synchronized (o1) {// 为o1加锁
  12.                 try {
  13.                     Thread.sleep(1000);// 线程休眠1秒钟
  14.                 } catch (InterruptedException e) {
  15.                     e.printStackTrace();
  16.                 }
  17.                 System.out.println(threadName + "进入同步块o1准备进入o2");// 显示进入o1块
  18.                 System.out.println(threadName + "已经进入同步块o2");// 显示进入o2块
  19.             }
  20.             if (flag == false) {
  21.                 synchronized (o2) {
  22.                     try {
  23.                         Thread.sleep(1000);
  24.                     } catch (InterruptedException e) {
  25.                         e.printStackTrace();
  26.                     }
  27.                     System.out.println(threadName + "进入同步块o2准备进入o1");// 显示进入o2块
  28.                     synchronized (o1) {
  29.                         System.out.println(threadName + "已经进入同步块o1");// 显示进入o1块
  30.                     }
  31.                 }
  32.             }
  33.         }
  34.     }
  35.    
  36.     public static void main(String[] args) {
  37.         DeadLock d1 = new DeadLock();// 创建DeadLock对象d1
  38.         DeadLock d2 = new DeadLock();// 创建DeadLock对象d2
  39.         d1.flag = true; // 将d1的flag设置为true
  40.         d2.flag = false; // 将d2的flag设置为false
  41.         new Thread(d1).start();// 在新线程中运行d1的run()方法
  42.         new Thread(d2).start();// 在新线程中运行d2的run()方法
  43.     }
  44. }
复制代码
提示对于4个同步块,去掉任何一个就可以解决死锁问题。
心法领悟:解决死锁的方法。
当具备以下4个条件时,就会产生死锁:资源互斥(资源只能供一个线程使用)、请求保持(拥有资源的线程在请求新的资源又不释放占有的资源)、不能剥夺(已经获得的资源在使用完成前不能剥夺)和循环等待(各个线程对资源的需求构成一个循环)。通常破坏循环等待是最有效的方法。


最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-3 13:58

Copyright 2015-2025 djqfx

返回顶部