使用资源排序解决Java线程死锁解决的方法

      经常看以前大学里面的教材中的一个解决线程死锁的例子,其技术叫做"资源排序",但代码只是一部分,我今天把它写全,这里的关键点是线程对各个对象加锁顺序一定得保持一致.

 

/**
 * 此类轻易的解决了死锁问题,其核心思想为 各线程按照顺序依次对各对象加锁,
 * 假设有三个线程需要竞争三个资源,线程加锁顺序是 lock1,lock2,lock3,这个应该称作为 "资源排序"
 * 
 * @author Chase
 *
 */
public class DeadLockSolution {
	private static final Object lock1 = new Object();

	private static final Object lock2 = new Object();
	
	private static final Object lock3 = new Object();

	private Thread1 thread1 = new Thread1();

	private Thread2 thread2 = new Thread2();
	
	private Thread3 thread3 = new Thread3();

	class Thread1 extends Thread {
		public void run() {
			synchronized (lock1) {
				
				System.out.println("线程1已对 1资源 加锁");
				
				try {
					
					Thread.sleep(1000);
					
				} catch (InterruptedException e) {}
				
				
				synchronized (lock2) {
					
					System.out.println("线程1已对 2资源 加锁");
					
					try {
						
						Thread.sleep(1000);
						
					} catch (InterruptedException e) {}
					
					synchronized (lock3) {
						
						System.out.println("线程1已对 3资源 加锁");
						
						try {
							
							Thread.sleep(1000);
							
						} catch (InterruptedException e) {}
					}
				}
			}
			System.out.println("线程1运行完毕!");
		}
	}

	class Thread2 extends Thread {
		public void run() {
			
			synchronized (lock1) {
				
				System.out.println("线程2已对 1资源 加锁");
				
				try {
					
					Thread.sleep(1000);
					
				} catch (InterruptedException e) {}
				
				synchronized (lock2) {
					
					System.out.println("线程2已对 2资源 加锁");
					
					try {
						
						Thread.sleep(1000);
						
					} catch (InterruptedException e) {}
					
					synchronized (lock3) {
						
						System.out.println("线程2已对 3资源 加锁");
						
						try {
							
							Thread.sleep(1000);
							
						} catch (InterruptedException e) {}
					}
				}
			}
			System.out.println("线程2运行完毕!");
		}
	}
	
	class Thread3 extends Thread {
		public void run() {
			
			synchronized (lock1) {
				
				System.out.println("线程3已对 1资源 加锁");
				
				try {
					
					Thread.sleep(1000);
					
				} catch (InterruptedException e) {}
				
				synchronized (lock2) {
					
					System.out.println("线程3已对 2资源 加锁");
					
					try {
						
						Thread.sleep(1000);
						
					} catch (InterruptedException e) {}
					
					synchronized (lock3) {
						
						System.out.println("线程3已对 3资源 加锁");
						
						try {
							
							Thread.sleep(1000);
							
						} catch (InterruptedException e) {}
					}
				}
			}
			System.out.println("线程3运行完毕!");
		}
	}

	public DeadLockSolution() {
		thread1.start();
		thread2.start();
		thread3.start();
	}

	public static void main(String[] args) {
		new DeadLockSolution();
	}
}

 

运行结果:

 

线程1已对 1资源 加锁
线程1已对 2资源 加锁
线程1已对 3资源 加锁
线程1运行完毕!
线程3已对 1资源 加锁
线程3已对 2资源 加锁
线程3已对 3资源 加锁
线程2已对 1资源 加锁
线程3运行完毕!
线程2已对 2资源 加锁
线程2已对 3资源 加锁
线程2运行完毕! 

 

不同的机器线程运行的先后可能不太一样,但是应该不会出现死锁的情况.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值