典型的顺序死锁


package com.thread.deadlock;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;



/**
 * 死锁的出现分2中情况:
 * 1.锁顺序死锁
 * 2.资源死锁
 * 资源死锁的典型例子是:线程饥饿死锁和数据库连接池的饥饿死锁
 * 
 * 本例演示的是锁顺序死锁
 * 当一个线程永远占用一个锁,而其他线程尝试去获得这个锁,那么它们将永远被阻塞。
 * 当线程A占用锁L时,想要获得锁M,但是同时,线程B持有锁M,并尝试获得L,两个线程将永远等待下去。
 * 这种情况是死锁最简单的形式(或称致命的拥抱)。
 * 发生在多个线程因为环路的锁依赖关系而永远等待的情况下。
 * 
 * 
 * 怎么避免出现锁顺序死锁?
 * 如果所有线程以通用的固定秩序获得锁,程序就不会出现锁顺序死锁的问题了。
 * 
 * @author hadoop
 *
 */
public class LeftRightDeadlock {
   private final Object left = new Object();
   private final Object right = new Object();
   
   public void leftToRight(){
	     synchronized(left){
	    	    synchronized(right){
	    	    	try {
	    				Thread.currentThread().sleep(20);//延迟执行时间,提高死锁概率
	    			} catch (InterruptedException e) {
	    				// TODO Auto-generated catch block
	    				e.printStackTrace();
	    			}
	    	    	 System.out.println(Thread.currentThread().getName() + "执行从左到右顺序的操作");
	    	    }
	     }
   }
   
   
   
   public void  RightToLeft(){
	   synchronized(right){
   	    synchronized(left){
   	    	try {
				Thread.currentThread().sleep(30);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
   	    	 System.out.println(Thread.currentThread().getName() +"执行从右到左顺序的操作");
   	    }
    }
   }
   
   public static void main(String[] args) {
	       ExecutorService mExecutor = Executors.newCachedThreadPool();
	       
	       final LeftRightDeadlock lrlock = new LeftRightDeadlock();
	       
	       for (int i = 0; i < 1000; i++) {
	    	   mExecutor.execute(new Runnable() {
	   			@Override
	   			public void run() {
	   				lrlock.RightToLeft();
	   			}
	   		});
		  }
	       
	       for (int i = 0; i < 1000; i++) {
	    	   mExecutor.execute(new Runnable() {
	   			@Override
	   			public void run() {
	   				lrlock.leftToRight();
	   			}
	   		});
		  } 
	   
   }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斗者_2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值