Java 解决死锁

概要:

死锁有一系列的方法可以避免,也有很多的判断和解决办法,在上一个实例中遇到的没法吃饭的死锁问题,解决方法有很多。例如,再增加一只筷子,甲或者乙可以拿到新增的筷子开始吃饭,吃完饭后将筷子资源释放,然后另一个人可以开始吃饭。本实例介绍一个避免死锁的方法,甲和乙都先拿起筷子1后拿起筷子2就不会有死锁问题。

| |目录

技术要点

    解决死锁问题的技术要点如下:

  • 死锁排除的方法:一是撤销陷入死锁的全部进程;二是逐个撤销陷于死锁的进程,直到死锁不存在;三是从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失;四是从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态。

  • 预防死锁需要防止进程在处于等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。因此,对资源的分配要给予合理的规划。

代码实现

package net.xsoftlab.baike;
public class TextSolveDeadLock {
	static String[] chopsticks = new String[] { "筷子1", "筷子2" };
	static class OneThread extends Thread { // 静态内部类
		public void run() {
			synchronized (chopsticks[0]) { // 在同一时间只能有一个类访问
				System.out.println("甲拿起了" + chopsticks[0] + ",在等待另一"
						+ chopsticks[1]);
				try {
					Thread.sleep(100); // 线程休眠
				} catch (Exception e) { // 捕获异常
					System.out.println("线程休眠出错:" + e.getMessage());
				}
				synchronized (chopsticks[1]) {
					System.out.println("甲又拿起了" + chopsticks[1]);
				}
			}
		}
	}
	static class TwoThread extends Thread { // 静态内部类
		public void run() {
			synchronized (chopsticks[0]) {
				System.out.println("乙拿起了" + chopsticks[0] + ",在等待另一"
						+ chopsticks[1]);
				try {
					Thread.sleep(100); // 线程休眠
				} catch (Exception e) { // 捕获异常
					System.out.println("线程休眠出错:" + e.getMessage());
				}
				synchronized (chopsticks[1]) {
					System.out.println("乙又拿起了" + chopsticks[1]);
				}
			}
		}
	}
	static class DaemonThread extends Thread { // 静态守护线程类
		public DaemonThread() {
			this.setDaemon(true); // 线程设置守护
		}
		public void run() {
			while (true) {
				try {
					Thread.sleep(1000); // 线程休眠
				} catch (Exception e) { // 捕获异常
					System.out.println("线程休眠出错:" + e.getMessage());
				}
				System.out.println("守护线程:程序正在运行...");
			}
		}
	}
	public static void main(String[] args) { // java程序主入口处
		OneThread one = new OneThread(); // 实例化对象
		TwoThread two = new TwoThread();
		DaemonThread daemon = new DaemonThread();
		one.start(); // 启动线程
		two.start();
		daemon.start();
	}
}

程序解读

    TextSolveDeadLock类中的静态内部类OneThread继承Thread线程类,扩展run()方法实现甲拿起“筷子1”在等待“筷子2”。静态内部类TwoThread类的run()方法实现乙拿起“筷子1”在等待“筷子2”。这样就解决了死锁问题。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消